我添加了一个连续运行的相对简单的动画。这用于短暂切换到另一个视图几秒钟。`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];
感谢。
编辑添加一些注意事项:
动画不进入空闲状态,即使有对动画的特定时间部分没有设定动画的指令(例如
addKeyframeWithRelativeStartTime
仅增加了1 /总动画时间的10)。
因此,animateKeyframesWithDuration:
可能不是用于具有“空闲”时间的动画的最佳解决方案(如上面的代码示例中) - 通过使用例如启动实际动画的计时器可以实现更好的性能,需要的时候。作为动画组成部分的所有图层都会为整个时间(上例中v1.layer和v2.layer)设置动画 - 再次,如果没有给定时间分数的特定指令集,不要闲置(它会继续重绘和消耗GPU,除非它不再可见)。
关于性能,它与其他CoreAnimation动画相媲美。
动画的绘制代码似乎只能在内部处理 - 在动画期间不会调用UIView
或CALayer
的绘制方法。这使得为任何视图设置动画会产生类似的性能结果(例如,绘制完整矩形的视图/图层不会比UILabel
或更复杂的视图/图层更高性能)。
编辑2:
在iOS上10(以及Mac OS塞拉利昂),动画占用少了很多资源。
想法是,实际的动画('addKeyFrameWithRelativeStartTime:..')仅占总时间的1/10 - GPU在整个时间内一直很高。我并不期待这里有任何神奇的东西,但动画相对简单,所以我预计它对GPU /能量的影响很小。 –
你只是让我重复自己。你读过我的回答了吗?它告诉你,无论你是一个人,认为动画是多么“简单”,都没有关系。计算机对此一无所知。每1/60秒,必须计算下一帧,并且必须绘制渲染树,而不管动画是由什么组成的。使用仪器(例如核心动画工具)来量化。 – matt
好吧,所以你说如果动画块设置为10秒,并且实际的动画/关键帧从第二个9到10设置,计算机将从第二个0开始进行神奇的计算,并且将重绘同样的东西对于前9秒,以及在9到10秒之间,它会做一些复杂的计算,以至于简单的人类头脑无法理解。指出。 –