我广泛使用-drawRect:做一些不错的动画。计时器尝试使用-setNeedsDisplay每秒触发30次,但感觉只有20次。此外,我不能使用-setNeedsDisplayInRect:因为动画涵盖了整个事物。
从-drawRect中取出一些绘图操作会有所帮助吗?并将它们移到子视图中? -drawRect必须做的少,但操作系统将有更多的工作与合成视图。
有经验法则哪一个更糟糕吗?我从苹果文本中记得他们声称Core Animation在动画期间不会重绘。他们的速度秘诀是什么?在动画中使用子视图?
答案 0 :(得分:1)
其中大部分与my answer到your other question类似:
到目前为止,合成速度更快。在iPhone上,使用Quartz绘图调用或位图图像将内容绘制到CALayer(或UIView的支持CALayer)中。然后将该图层光栅化并有效地作为GPU上的OpenGL纹理进行缓存。这种绘图和缓存操作非常昂贵,但是一旦该层位于GPU上,它就可以以硬件加速的方式移动,缩放,旋转等。所有GPU必须做的同时图层动画是每帧都将其与其他屏幕图层合成。这就是为什么即使是最老的iPhone机型,Core Animation也能以60 FPS的速度在屏幕上进行50层动画制作。
图层和视图仅在提示时重绘,或者在needsDisplayOnBoundsChange
属性设置为YES时重新调整大小。绘图系统以这种方式设置,因为重绘和重新缓存图层内容的成本有多高。如果可以,请避免定期重新绘制图层内容,而是将其拆分为可以使用Core Animation单独设置动画的图层或视图。如果你需要为变化的形状设置动画,请查看CAShapeLayer,这比简单地重绘每一帧更有效。
最糟糕的情况是,您可以将视图中静态的部分移动到一个视图,然后使用子视图,其中只包含绘图的变化部分。性能不会很好,但是如果必须重新绘制视图中的所有内容,它会好得多。与绘图费用相比,合成开销可以忽略不计。