7

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

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

我有两个问题

  1. 发生了什么变化iOS7
  2. 为什么改变视图的不透明度会产生影响?

上述问题的更多信息:

动画设置

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

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

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

self.alpha = 0.99;

一些有趣的观点:

  1. 设置alpha动画的内部也可以
  2. alphaback 设置为1.0after 动画,然后使用 1.0 alpha 执行反向动画不会提供平滑的反向动画。

不透明度修复

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

如上所述,我不知道当只有一张图像时这会产生什么影响(就像我在问题中描述的情况一样)。尤其是得到了生涩的动画后,反向动画还是生涩的。这两种情况的另一个不同点是,在当前问题中只有缩放会导致问题,而在双图像问题中,它是平移缩放。


我希望以上内容很清楚 - 任何见解都值得赞赏。

4

1 回答 1

4

查看组不透明度。iOS 7 默认开启,这改变了视图/图层的合成方式:

当 UIViewGroupOpacity 键不存在时,默认值现在是 YES。以前的默认值为 NO。

这意味着透明视图的子视图将首先合成到该透明视图上,然后将预合成的子树作为一个整体绘制到背景上。NO 设置导致合成成本更低,但精度也更低:透明子树中的每个视图都根据父级的不透明度,按照正常画家的算法顺序合成到它下面的内容上。

(来源:iOS7 发行说明

启用此设置后,合成(在动画期间也是如此)的成本要高得多。

此外,查看 CoreGraphics Instruments 工具以检查您是否有大量屏幕外图像正在合成。

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

于 2013-10-03T05:53:26.007 回答