`animateKeyframesWithDuration` - 高GPU

时间:2016-03-14 16:28:38

标签: ios objective-c

我添加了一个连续运行的相对简单的动画。这用于短暂切换到另一个视图几秒钟。

动画运行时,iPhone 6(iOS 9.2.1)上的GPU从<5%跃升至恒定的30-40%,而“能量影响”#39;模拟器上的(活动监视器)上升了。请注意,实际动画只占用一小部分时间(底部代码),但GPU在整个时间内保持高位。为动画视图设置不透明的背景并不能改善。

虽然动画看起来很流畅,但这看起来很奇怪,所以我想知道是否有我错过或做错的事情,或者是否有关于animateKeyframesWithDuration的某些已知错误方法。

下面是一个简化的代码示例,它会导致相同的高GPU消耗:

v1.alpha = 0;
[UIView animateKeyframesWithDuration:10 delay:0
                             options:UIViewKeyframeAnimationOptionAutoreverse | UIViewKeyframeAnimationOptionRepeat | UIViewKeyframeAnimationOptionCalculationModeLinear
                          animations:^
 {
     [UIView addKeyframeWithRelativeStartTime:0.9/10 relativeDuration:0.1/10 animations:^{
         v2.alpha = 0;
         v1.alpha = 1;
     }];
 } completion:nil];

感谢。

编辑以添加一些注释:

  1. 即使没有为动画的特定时间部分设置动画指令,动画也不会空闲(例如,addKeyframeWithRelativeStartTime只添加1/10的动画总动画时间) 因此,animateKeyframesWithDuration:可能不是动作和空闲动画的最佳解决方案。时间(如上面的代码示例中所示) - 例如,可以通过使用计时器来实现更好的性能,该计时器在需要时启动实际动画。

  2. 作为动画一部分的所有图层将为整个时间设置动画(在上面的示例中为v1.layer和v2.layer) - 再次,如果在给定时间内没有特定的指令集分数,它不会空闲(它将继续重绘和消耗GPU,除非它不再可见)。

  3. 关于性能,它与其他CoreAnimation动画相当 动画的绘制代码似乎只在内部处理 - 动画期间不会调用UIViewCALayer的绘制方法。这使得为​​任何视图设置动画将具有类似的性能结果(例如,绘制完整矩形的视图/图层将不会比UILabel或更复杂的视图/图层更高效。

  4. 编辑2:

    在iOS 10(以及Mac OS Sierra)上,动画占用的资源要少得多。

1 个答案:

答案 0 :(得分:1)

动画在后台线程上执行,并通过特殊进程(“动画服务器”)在GPU上逐帧进行管理。持续时间在这里没有兴趣;您被设置为永远重复,因此动画服务器必须永远执行动画。正如你所发现的那样,这不是免费的。每一帧都是一个新的计算和一个新的绘图。这需要工作。动画服务器执行此操作并不容易,因为它已经完成了“相同”动画。 (iPhone不是某种神奇的永动机!)