CATransiton 闪烁带背景动画

Posted

技术标签:

【中文标题】CATransiton 闪烁带背景动画【英文标题】:CATransiton Flicker w/ background animations 【发布时间】:2011-05-13 07:36:44 【问题描述】:

我正在使用CATransitionCALayer 随机进出UIViewUIView 不是全屏。)新图层从右侧进入,旧图层从右侧进入左。 CAlayer 的内容属性设置为CGImageRefs。这是我认为相关的代码:

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 秒的停顿,然后一个新的图像被动画化,等等。这在模拟器中效果很好,但在我的第二代 iPod Touch 上,动画中偶尔会出现打嗝。具体来说,动画所在的图层将在当前显示的图层上方闪烁。这些闪烁不一致但很明显。

我认为可能的罪魁祸首是我在这个过渡背后的背景动画。有几十个CAlayer 在后台飞进飞出全屏视图。当我删除这些背景动画或将过渡的动画持续时间设置为更长的持续时间(2 秒以上)时,动画效果很好(我希望动画时间为 0.75 秒。)

我的第一个想法(似乎得到上述观察结果的支持)是我将 CoreAnimation(至少对于我的 iPod)推得太紧,需要妥协。为什么我无法接受这一点是除了偶尔的闪烁之外,场景渲染得非常好(几乎没有延迟)。

如果有人对此问题或一般的 CoreAnimation 优化有任何意见,我将不胜感激!

感谢阅读

更新:

有机会在 iPhone 4 上对此进行测试,但从未发生过闪烁。此外,CoreAnimation 仪器证实,在我的第 2 代 iPod Touch 上,我的 FPS 始终保持在 40 到 50 到低/中。

【问题讨论】:

【参考方案1】:

只是猜测:您是否尝试过管理您的 CATransactions?

您可以尝试像这样将您对场景的修改括起来:

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

【讨论】:

我已经尝试过了,不幸的是似乎没有任何效果(这很有趣,因为我的印象是 CATransiton 有一个与之关联的隐式 CATransaction。) 您是否尝试过在正在转换的图层上使用较低分辨率的图像?转换完成后,您可以淡入高分辨率图像。 好建议!事实证明,我的艺术资产对于最终缩小到的尺寸来说太大了。通过稍微减小它们的尺寸和分辨率,我能够获得必要的性能。 顺便说一句,我猜到了这一点,因为我开始怀疑你的 GPU 是否受到(纹理)带宽限制..【参考方案2】:

我会消除所有阴影(如果有的话),然后检查性能是否有所提高。我已经看到阴影,尤其是 CAShapeLayers 上的阴影,对动画的平滑度有很大影响。

【讨论】:

感谢您的建议。但是,所有图层都没有阴影。

以上是关于CATransiton 闪烁带背景动画的主要内容,如果未能解决你的问题,请参考以下文章

具有清晰背景的 Segue 推送动画在 iOS 7 上闪烁

悬停效果闪烁的 CSS 动画,在 FF 中未正确显示

动画 UIView alpha 时闪烁

使用两个图像为 iphone tableviewCell 背景图像设置动画

单击一个时如何禁用其他星星上闪烁的颜色/动画?

JS框架_(JQuery.js)夜晚天空满天星星闪烁动画