我有一个每秒触发 30 次函数的循环。该函数改变了我用来制作动画的几个点的位置。我在所有点上画线,这意味着这些线每秒会改变 30 次。
我将这些线绘制到 CGLayer,然后在 drawRect: 方法中将其绘制到 UIView。我这样做是因为我知道在屏幕外绘图时性能会有所提高。但是,似乎 CGLayer 保存了所有实际线条而不是绘制的像素,因为即使我清除它,当绘制更多线条时,程序运行速度也会越来越慢。
我正在寻求其他方法来制作动画。什么是最有效的方法,为什么?
我有一个每秒触发 30 次函数的循环。该函数改变了我用来制作动画的几个点的位置。我在所有点上画线,这意味着这些线每秒会改变 30 次。
我将这些线绘制到 CGLayer,然后在 drawRect: 方法中将其绘制到 UIView。我这样做是因为我知道在屏幕外绘图时性能会有所提高。但是,似乎 CGLayer 保存了所有实际线条而不是绘制的像素,因为即使我清除它,当绘制更多线条时,程序运行速度也会越来越慢。
我正在寻求其他方法来制作动画。什么是最有效的方法,为什么?
您应该使用 Core Animation 框架为图层上的属性设置动画。您可以子类CALayer
化或使用委托来进行实际绘图。在绘图代码中,您可以访问被插值的属性,并使用它来移动点、更改线条的粗细或 Core Graphics 允许您控制的任何其他内容。查看Apple 的此示例代码,了解它如何使用lineWidth
动画中的值。
John Blackburn 的这个小教程是我最喜欢的 Core Animation 介绍之一。有几个不同的概念需要掌握,但总的来说,创建相当复杂的动画非常简单。
您对运行速度越来越慢的问题很可能与 Core Graphics 无关。例如,您可能不小心创建了越来越多的计时器。
如果您有一条需要在状态之间进行动画处理的路径,我强烈建议您查看CAShapeLayer。此图层类型允许您指定两条路径(具有相同数量的控制点)并使用核心动画在它们之间平滑动画。
关于这个主题的两篇好文章是Matt Long的“Marching Ants With Core Animation”和 Joe Ricioppo 的“Complex Interpolation with CAShapeLayer(免费)”。
如果您的图像部分保持不变,并且您只需要在其上合成新元素,我建议您将图像的一部分绘制到静态 CALayers 或 UIViews 中,然后在其上添加新视图改变的部分。层的合成比重绘视图或层的内容要快得多。