如何在 iOS 中高效地使用图像制作动画

Posted

技术标签:

【中文标题】如何在 iOS 中高效地使用图像制作动画【英文标题】:How to do animations using images efficiently in iOS 【发布时间】:2011-12-28 02:26:08 【问题描述】:

当我目前面临崩溃问题时,如何在不消耗大量内存(或高效)的情况下在 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,如果可以的话,任何人都可以建议一个示例代码。

【问题讨论】:

【参考方案1】:

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

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

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

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

    您还可以尝试为图像使用更小的占用空间格式(即 RGB565 代替 RGB8888,每像素 16 位而不是 32 位)。

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

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

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

【讨论】:

您能否建议使用 Core Animation 或 OpenGL 执行相同操作的等效代码 40Kb x 100 = 巨大的精灵表...您将无法将其用于图层的内容。【参考方案2】:

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

【讨论】:

以上是关于如何在 iOS 中高效地使用图像制作动画的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何制作动画轨迹

如何在 Kivy 中制作重复的旋转动画?

iOS核心动画高级技巧 - 8

如何在 Unity3d 中最好地为 2D 精灵设置动画? [关闭]

如何在 R 中使用 OpenGL 加速有效地为图像栅格设置动画?

如何在 iOS Swift 中制作加载动画?