我正在开发一个应用程序,客户想要为大图像 (305x332) 制作动画。客户希望在 1.75 秒内循环播放 50 帧动画。我发现该应用程序在进行如此多的处理时速度非常慢。启动、触摸响应和关闭都很慢。在 iPhone 本身上,该应用程序经常会崩溃或锁定手机。请参阅下面的代码。我的问题:
- 我是否做了什么导致性能不佳的事情,或者 50 帧的要求太多了?
- 动画帧数和动画速度是否有最佳实践?
- 动画中的图像大小是否有最佳实践?
请告诉我。这是代码...
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
for(int i = 1; i <= 50; i++)
{
[tempArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%@-%d-%04d.JPG",[constitution getConstitutionWord], constitution.getAnimationEnum, i]]];
}
backgroundImage.animationImages = tempArray;
[tempArray release];
backgroundImage.animationDuration = 1.75; // seconds
backgroundImage.animationRepeatCount = 0; // 0 = loops forever
[backgroundImage startAnimating];
我不久前进行了一些测试。在 UIImageview 动画放弃并停止之前,我设法最大程度地处理了大约 20K 个 PNG 的大约 40 帧。
如果您需要更多,您可以改用视频或编写自己的动画渲染引擎。渲染引擎非常简单。它将在一个计时器上运行,该计时器从队列的头部获取已经加载的 UIImage,更新视图然后释放图像。一个单独的线程在队列尾部预加载几帧。这样,在任何给定时间,内存中最多有 N 帧。您可以对其进行调整,以找到计时器延迟和为应用程序预加载的帧数之间的最佳平衡。
我参与的一个项目使用该技术毫无问题地显示数百张大图像。
一些提示:
尽可能多地使用 CALayers。
显示每一帧时不要进行任何缩放。尝试使每个源图像具有您想要显示的精确尺寸。
尽量不要用其他视图覆盖动画。它会减慢事情的进展。
您可以从捆绑包或通过扫描目录加载图像列表。捆绑包的缺点是如果不更新整个应用程序就无法更新图像。从目录加载的缺点是,首次启动时,您必须将图像从包复制到可写位置,并且应用程序在运行时的大小会变大。主要好处是您可以通过网络更新该目录中的媒体。
声音同步变得有点冒险。您必须想出自己的方式来指定何时开始/停止声音。如果您有声音并且需要精确(例如口型同步),那么视频路线可能更实用。
祝你好运。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)