如何在iOS中有效地使用图像动画

时间:2011-11-13 15:48:48

标签: iphone ios crash core-animation

我如何在iOS中做动画而不消耗大量内存(或有效),因为我目前面临崩溃问题?

对于单个动画,我有100个图像的序列,每个图像大约40kb;像这样,大约有7个动画,共计近700个图像。

例如,我在这里展示了一个带有2个图像的示例动画。这是我当前的动画代码。

/*First taking two images into an Array*/
NSArray *imageArray = [NSArray arrayWithObjects:[UIImage imageNamed:@"img1"],[UIImage imageNamed:@"img2"],nil];  
/*Creating an image view as a layer for performing the animation */
imgView = [UIImageView alloc];
[imgView initWithFrame:CGRectMake(110,245,100,100)];
/*Setting the images for performing animations*/
imgView.animationImages = imageArray;
imgView.animationDuration = 8.5 ;//delay for performing the animation
imgView.animationRepeatCount = 1;
/* ..and finally adding the animation to the current view */
[self.view addSubview:imgView];
[imgView startAnimating];
[imgView release];
[imgView stopAnimating];
imageArray = nil;
[imageArray release];

任何人都可以建议对代码进行任何改进,以便动画可以有效地完成,或者是否有其他替代方案,如openGL或Core Animation,如果有的话,任何人都可以提出示例代码。

2 个答案:

答案 0 :(得分:3)

我的建议是使用Cocos2d,这是一个基于Open GL的框架,专门为游戏设计。

在您的情况下,您将获得的优势是:

  1. 使用纹理图集而不是单个图像来节省尽可能多的内存;

  2. 将PVR格式用于图像(与PNG相比); PVR是iPhone / iPad图形芯片的原生格式,可以节省更多内存;

  3. 您还可以尝试为图像使用更小的封装格式(即RGB565而不是RGB8888,每像素16位而不是32位)。

  4. 如果您认为这对您有用,请查看this tutorial

    你可以直接使用Open GL或Core Animation来做同样的事情,但我认为最好让Cocos2d处理低级别的东西。

    对于基于核心动画的教程,请查看this post。正如您将看到的,您将实现一些Cocos2d已经为您提供的课程(以及许多其他功能)。

答案 1 :(得分:2)

上面的mysterycoconut链接是一个很好的链接,因为它避免了“使用Cocos2D”反射帖,当人们在SO上询问CoreGraphics动画相关问题时,这似乎总是出现。您遇到的问题的根源是一个经过深思熟虑的animationImages API,它消耗了太多的应用程序内存,永远不应该使用。您可以在Video and Memory usage on iOS devices阅读有关问题的详细说明。我在那里描述了我自己的问题解决方案。基本上,您希望将图像数据解压缩到文件,然后将内容blit到图形卡中。这在iOS下非常快,CoreGraphics利用图形卡级别的优化纹理逻辑来限制缓冲区副本,因此设备CPU的使用非常少。通过这种方法,可以在不使用CoreGraphics的所有应用程序内存的情况下获得数百张图像的非常快的动画(45到60 FPS)。