2

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

我对这是多么的糟糕感到有点震惊,尤其是在阅读了这么多关于 Quartz 2D 等令人欣慰的东西之后。我觉得我必须在这里遗漏一些基本的东西!

帮助!

4

3 回答 3

2

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

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

于 2010-07-13T02:22:22.113 回答
1

It turns out the issue is that all you need to add some sort of epsilon between the offsets you start with. You end up with n*2 animating at the tail of each pass and the start of the next just for an instant. For some reason this makes the animation system barf even if it's just a processing slice they share.

Making it be

offset += duration * 1.05;

resolved the jerkiness between passes that clogged up the animations.

于 2010-07-13T16:41:11.740 回答
1

编辑:[删除]

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

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

于 2010-07-13T02:50:15.827 回答