同时对CALayer财产动画数量的合理预期?

时间:2010-07-13 02:05:36

标签: iphone core-animation quartz-2d

我正在使用UIView动画块一次在显示器的多个图层上为CALayer属性(在本例中为backgroundColor)设置动画。

所有图层都是不透明的,我在一个块中制作动画,基本上就像这样

[UIView beginAnimations:@"outer" context:nil];
float duration = .25;
float offset = 0.0;
for( NSArray *viewsInPass in viewQueue ) {
   for( UIView *innerView in viewInPass ) {
       [UIView beginAnimations:@"inner" context:nil];
       [UIView setAnimationDelay:offset];
       [UIView setAnimationDuration:duration];
       [innerView.layer setBackgroundColor:[newColor CGColog]];
       [UIView commitAnimations];
   }
   offset += duration;
}
[UIView commitAnimations];

一旦这有4-5个并发层为它们的背景颜色设置动画,它就会变得非常不稳定,并且设备基本上开始完全错过它的渲染率并且只是冻结到剩余动画的末尾。所有视图都不重叠,它们都是不透明的,通常大约为20x20像素。

我对这种非高性能感到有些震惊,尤其是在阅读了有关Quartz 2D等许多令人满意的事情后,我觉得我必须在这里遗漏一些基本的东西!

帮助!

3 个答案:

答案 0 :(得分:2)

视图中的不透明度是最大的性能影响 - 如果您可以在整个渲染过程中保持它们不重叠并且完全不透明(即在该视图序列中的任何位置都没有透明度,包括背景),您会稍微好一些逆足

我设法以~30 fps(即整个屏幕)获得一个大型动画,但遇到内存限制(原始的iPhone / iPod),最终杀死了我。如果你想要的不仅仅是你要去的地方,你需要进入OpenGL领域 - 通过游戏框架或直接进入。 Objective-C调用该循环的开销,以便在您循环浏览图像的同时更改偏移量,最终会杀死您。

答案 1 :(得分:1)

编辑:[已删除]

由于每个动画都以前一个动画开始结束,因此您可以在NSTimer或委托didFinish回调中启动每个动画,而不是一次排队所有动画。这样可以减少对动画系统的需求。

您应该尝试确保没有视图同时排队使用不同的颜色。

答案 2 :(得分:1)

事实证明,问题是你需要在你开始的偏移之间添加某种epsilon。你最终会在每个传球的尾部进行n * 2动画,然后在瞬间完成下一个传球的开始。出于某种原因,这使得动画系统成为barf,即使它只是它们共享的处理切片。

成为

偏移+ =持续时间* 1.05;

解决了堵塞动画的传球之间的混乱。