iOS中长时间运行的动画(最长1/2小时)

时间:2014-07-08 10:50:38

标签: ios7 core-animation

所以我现在有this动画饼图。它可以指示例如随着时间的推移(类似于UIProgressView)。

由于遗留原因,我仍在使用一个可以触发大约的计时器。每秒钟增加progress。现在应该可以摆脱这个计时器并设置饼图动画的总持续时间,例如到1/2小时,而不是让计时器点火30 * 60次并开始尽可能多的短增量动画。

所以我的问题是这样的:有没有什么好的理由反对在iOS中使用如此长的(比如长达1/2小时)动画?在饼图的例子中不超过约。即使超过半小时也需要360帧。

1 个答案:

答案 0 :(得分:2)

有很好的理由反对很长的动画:记忆 CoreAnimation会为每一帧创建presentationLayer(例如参见your other question),并且(至少在iOS 7.1之前)它会在您添加动画时在后台分配和初始化它们到层。

帧速率取决于设备,而不取决于动画属性的变化幅度;此外,似乎没有办法在iOS上调整CoreAnimation的帧速率(在OSX NSAnimation上有frameRate属性),所以如果你动画progress(但它与任何属性都是一样的)并设置30分钟的持续时间,你最终会浪费很多的内存。

有些数字。我在CABasicAnimation上安排了一些路径为progress的{​​{1}},并在DZRoundProgressLayer中添加了一些记录。这表明在模拟器上,每秒动画需要大约50个阴影副本(帧) 这意味着将创建 90K 卷影副本30分钟:在动画开始后的几秒钟内,-initWithLayer:仍在分配前几千个副本。将一些数据有效负载添加到CoreAnimation的实例变量中显示内存使用量在第一秒内增加了几MB(然后一些内存管理接管了无约束的分配,可能会释放旧的副本)。

这是一个坏主意吗?它是浪费资源,内存和CPU,即使你的图层占用内存中的几个字节,考虑到每帧饼图区域的变化太小而不能被注意到。设置DZRoundProgressLayer或KVO并不需要多行代码,因此可能需要更改方法。