2016-03-14 13 views
1

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

当动画运行时,GPU在iPhone 6(iOS 9.2.1)上从< 5%跳到常量30-40%,而模拟器上的“能量影响”(活动监视器)向上。请注意,实际动画只占用一小部分时间(代码在底部),但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或更复杂的视图/图层更高性能)。

编辑2:

在iOS上10(以及Mac OS塞拉利昂),动画占用少了很多资源。

回答

1

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

+0

想法是,实际的动画('addKeyFrameWithRelativeStartTime:..')仅占总时间的1/10 - GPU在整个时间内一直很高。我并不期待这里有任何神奇的东西,但动画相对简单,所以我预计它对GPU /能量的影响很小。 –

+0

你只是让我重复自己。你读过我的回答了吗?它告诉你,无论你是一个人,认为动画是多么“简单”,都没有关系。计算机对此一无所知。每1/60秒,必须计算下一帧,并且必须绘制渲染树,而不管动画是由什么组成的。使用仪器(例如核心动画工具)来量化。 – matt

+0

好吧,所以你说如果动画块设置为10秒,并且实际的动画/关键帧从第二个9到10设置,计算机将从第二个0开始进行神奇的计算,并且将重绘同样的东西对于前9秒,以及在9到10秒之间,它会做一些复杂的计算,以至于简单的人类头脑无法理解。指出。 –

相关问题