带有背景动画的CATransiton Flicker

时间:2011-05-13 07:36:45

标签: iphone objective-c core-animation calayer catransition

我正在使用CATransitionCALayer移入和移出UIViewUIView不是全屏。)新图层从右边,旧图层左边。 CAlayer的内容属性设置为CGImageRef。以下是我认为相关的代码:

CATransition *transition = [CATransition animation];

transition.duration = transitionTime;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;

transition.delegate = self;
[view.layer addAnimation:transition forKey:nil];

// onDeck is the layer stage-right and is about to enter
[view.layer addSublayer:onDeck];    

// onStage is the layer currently in the middle of the view and is exiting
if (onStage)
   [onStage removeFromSuperlayer];

此动画发生,暂停1秒钟,然后在等等中动画新图像。这在模拟器中运行得很漂亮但在我的第2代iPod Touch上,动画中偶尔会出现打嗝。具体地,被动画化的层将在当前显示的层的顶部闪烁。这些闪烁不一致但很明显。

我已经缩小到可能的罪魁祸首是我在这次转变背后的背景动画。有几十个CAlayer在后​​台进出全屏视图。当我删除这些背景动画或将过渡的动画持续时间设置为更高的持续时间(2秒+)时,动画效果很好(我希望动画时间为0.75秒。)

我的第一个想法(这似乎得到了上述观察的支持)是我推动CoreAnimation(至少对我的iPod来说太难)并且需要妥协。为什么我在接受这个问题时遇到了麻烦,除了这种偶然的闪烁外,场景呈现得非常好(几乎没有延迟)。

如果有人对此问题或CoreAnimation优化有任何意见,我会非常感激!

感谢您阅读

更新

有机会在iPhone 4上测试这个并且闪烁从未发生过。此外,CoreAnimation乐器证实,在我的第二代iPod Touch上,我在FPS中一直高达40s,低至中50s。

2 个答案:

答案 0 :(得分:0)

我会摆脱所有阴影(如果你有的话),然后检查性能是否有所改善。我已经看到阴影,尤其是CAShapeLayers上的阴影,对动画的流畅性产生了很大的影响。

答案 1 :(得分:0)

只是一个猜测:你有没有试过管理你的CATransactions?

您可以尝试将修改包括在场景中,如下所示:

[ CATransaction begin ]
... your animations ...
[ CATransaction commit ] ;