objective-c – 寻求iOS6和iOS7之间动画性能差异的解释

我一直在开发一款iPad应用程序,可以在非常大的图像上执行动画(全屏图像可以放大2倍,仍然是视网膜质量).在缩放和平移时,我花了很多时间来获得平滑过渡.然而,当在iOS7上运行应用程序时,动画变得非常生涩(帧速率慢).

进一步测试表明,导致问题的是缩放动画(平移不会导致问题).有趣的是,我已经能够通过将图像的alpha设置为0.995(而不是1.0)来修复它.

我有两个问题

>为了实现这一目标,iOS7发生了哪些变化?
>为什么更改视图的不透明度会有所不同?

有关上述问题的进一步信息:

动画设置

动画都是预定义的,并在用户交互时播放.动画都是平移和缩放的混合.动画非常简单:

[UIView animateWithDuration:animationDuration delay:animationDelay options:UIViewAnimationoptionCurveEaseInOut animations:^{
    self.frame = nextFrame;
    //...
} completion:^(BOOL finished) {
    //...
}];

为了修复生涩的动画,我在动画之前设置了alpha

self.alpha = 0.99;

一些有趣的观点:

>在动画中设置alpha也可以
>在动画后将alpha设置回1.0,然后使用1.0 alpha进行反向动画并不能提供平滑的反向动画.

不透明度修复

我之前使用不透明度修正来在缩放和平移多个图像时使动画变得平滑.例如,我有两个大图像以不同的速度平移和缩放,一个在另一个上面.当较低图像的先前未渲染部分(底部图像)变得可见时,动画将变得不稳定(平移和缩放).在这种情况下,我想为什么alpha有帮助,如果顶部图像有一点透明度,则必须始终渲染底部图像,这意味着它可以在动画发生之前进行缓存.这个想法得到了反向动画的支持而没有看到生涩的动画. (我想我很想知道是否有人对此有不同的看法).

说了上面的话,我不知道当只有一张图像时这会产生什么影响(就像我在我的问题中描述的情况一样).特别是在获得生涩动画之后,反向动画仍然是生涩的.这两种情况之间的一个不同点是它只是缩放导致当前问题的问题,而在双重图像问题中它是平移和缩放.

我希望上面的内容很清楚 – 任何见解都是值得赞赏的.

解决方法

看看Group Opacity. iOS 7认打开,这会改变视图/图层的合成方式:

When the UIViewGroupOpacity key is not present,the default value is
Now YES. The default was prevIoUsly NO.

This means that subviews of a transparent view will first be
composited onto that transparent view,then the precomposited subtree
will be drawn as a whole onto the background. A NO setting results in
less expensive,but also less accurate,compositing: each view in the
transparent subtree is composited onto what’s underneath it,according
to the parent’s opacity,in the normal painter’s algorithm order.

(来源:iOS7 Release Notes)

启用此设置后,合成(也在动画期间)会更加昂贵.

另外,请查看CoreGraphics Instruments工具,检查是否有大量的屏幕外图像合成.

您是否在动画视图中进行了任何类型的更改?这将触发从后备存储中更多地丢弃渲染层图像.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...