代码之家  ›  专栏  ›  技术社区  ›  groundhog

对同时播放的Calayer属性动画数量的合理预期?

  •  2
  • groundhog  · 技术社区  · 16 年前

    我正在使用uiview动画块在显示器的多个层上同时动画calayer属性(本例中为背景色)。

    所有层都是不透明的,我在一个块中设置所有内容的动画,基本上是这样的

    [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像素。

    我有点震惊,这是多么的不执行,特别是在阅读了那么多关于石英二维等令人高兴的东西后,我觉得我一定是错过了一些基本的东西在这里!

    救命!

    3 回复  |  直到 16 年前
        1
  •  2
  •   heckj    16 年前

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

    我设法以大约30帧的速度(即全屏)制作了一个大型动画,但遇到了内存限制(原始的iPhone/iPod),最终导致我死亡。如果你想要的不仅仅是你要得到什么,你需要进入OpenGL的土地-通过游戏框架或直接。循环中的objective-c调用的开销,使您能够在循环图像的同时更改偏移量,这最终会杀死您。

        2
  •  1
  •   drawnonward    16 年前

    编辑:[删除]

    由于每个动画都以前一个动画的结尾开始,因此可以在nstimer或委托didffinish回调中开始每个动画,而不是一次对所有动画进行排队。这将减少对动画系统的需求。

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

        3
  •  1
  •   groundhog    16 年前

    结果发现问题是,你只需要在你开始使用的偏移量之间添加某种epsilon。最后,在每一个关卡的尾部和下一个关卡的开始都会有一个n*2的动画效果。出于某种原因,即使动画系统只是他们共享的一个处理切片,它也会使动画系统死机。

    使它成为

    偏移量+=持续时间*1.05;

    解决了阻碍动画的传球之间的抖动问题。