我在动画大量(数百)小CALayers
的不透明度方面遇到了一些困难。我使用的是Core Animation,但是到目前为止使用CVDisplayLink
来改进这一点。
我发现,将所有这些图层分开并为其不透明度设置动画会产生极其糟糕的性能。在显示更新代码中,我只会这样做:
for layer in layersToAnimateIn {
layer.opacity = newOpacity
}
将所有这些图层移动到一个更大的包含图层并为其不透明度设置动画似乎处理得更好。
containingLayer.opacity = newOpacity
由于我在每种情况下处理相同数量的图层,并且视觉效果相同,有人可以解释为什么性能会发生如此显着的变化吗?系统显然会在每次屏幕刷新时改变数百层的不透明度。
答案 0 :(得分:1)
您对图层树所做的每项更改都会产生性能成本:您在一个事务中修改的图层越多,CA必须执行的工作就越多,才能更新其数据模型。如果你将所有内容都改为相同的不透明度,那么你所采用的方法就是正确的 - 只需改变超级层的不透明度。
如果确实需要一次将一组图层属性设置为不同的值,请确保禁用隐式动画 - 否则,您将获得每个图层上每个已更改属性的自动动画,这会产生显着的性能成本它自己的。当你从计时器或显示链接设置属性时,这一点尤其重要:如果你在一秒钟内设置了30次属性,那么你在那个时间创建了30个动画,这就是......不好说至少。要禁用隐式动画,请将代码包装在事务中设置属性的位置,如下所示:
CATransaction.begin()
CATransaction.setDisableActions(true)
for layer in layersToAnimateIn {
// …
}
CATransaction.commit()