Iphone 对物业数量的合理预期?

Iphone 对物业数量的合理预期?,iphone,core-animation,quartz-2d,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

我使用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像素

我有点震惊,这是多么没有表现,特别是在阅读了这么多关于石英2D等令人满意的东西后。我觉得我一定是错过了一些基本的东西


救命啊

视图中的不透明性是对性能影响最大的一个因素-如果您可以在整个渲染过程中防止视图重叠和完全不透明(即,视图序列中的任何地方,包括背景,都没有透明度),您将获得更好的性能

我设法以每秒30帧(即整个屏幕)的速度制作了一个大型动画,但由于内存限制(最初的iPhone/iPod),最终导致了我的死亡。如果你想了解更多的东西,你需要进入OpenGL领域——要么通过游戏框架,要么直接进入。在循环中调用objective-C以在循环浏览图像的同时更改偏移量的开销最终会使您丧命。

Edit:[已删除]

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


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

问题是,您只需要在开始的偏移量之间添加某种ε。在每一个过程的末尾和下一个过程的开始都会有n*2个动画,只需一瞬间。出于某种原因,这会使动画系统呕吐,即使它只是它们共享的一个处理片段

让它成为

偏移量+=持续时间*1.05


解决了阻塞动画的两次传球之间的抖动问题。

事实上,这是错误的。CAAnimation有一个事务模型和事务嵌套,因此它将具有不同开始时间的所有动画排队到同一个动画事务中。如果不这样做,由于所有动画调度开销,性能甚至更差。我试着单独完成每个过程,让每个动画在自己的事务中独立运行,但它遇到了各种各样的问题。NSTimer由于较小的调度抖动而导致动画阶段不匹配。animationsDidFinish最终除了一个额外的选择器调用之外没有任何帮助。如果您的视图不是交互式的,那么在单个视图中移动到CALayers会有什么不同吗。