CoreAnimation编程指南翻译(八):提升动画性能

使用Core Animation可以提升动画帧率, 但不能保证动画性能. 特别是在OS X中, 需要考虑如何更高效的使用Core Animation. 要提升应用性能, 可以使用Instruments进行性能检测和问题追踪.

选择合适的图层重绘策略(OS X)

如果使用图层支持视图, 应根据需求为图层设置合适的重绘策略. 在大部分情况下, 默认的重绘策略并不是性能最优的, 比如NSViewLayerContentsRedrawOnSetNeedsDisplay策略能够减少图层重绘的工作量, 从而提升应用性能. 其他的重绘策略在特定情况下也可以提升应用性能.

优化图层渲染路径(OS X)

可以使用updateLayer方法直接提供图层内容, 避免实际渲染, 从而优化性能.

更多关于图层渲染路径相关的内容, 请参阅使用Delegate提供图层内容.

常用的性能优化技巧

在进行任何性能优化操作之前, 都应当先对应用当前的性能情况进行检测. 对比优化操作之前和之后的性能检测结果, 就能确定优化操作是否有效.

尽可能使用不透明图层

如果图层的opaque属性被设置为YES, Core Animation就不会处理图层的alpha通道. 也就意味着不用考虑图层内容和图层背景的混合, 从而节约了渲染时间. 但是如果通过图层的contents属性设置图层内容图像, 无论opaque属性的值如何, 图像的alpha通道都将被保留.

尽可能给CAShapeLayer对象设置简单路径

CAShapeLayer会把路径渲染成位图, 并将其作为自身图层内容. 这个渲染过程会尽可能的生成高分辨率的位图, 但这样会消耗额外的渲染时间. 如果提供的路径过于复杂, 对路径进行光栅化的代价将会十分昂贵. 如果图层的大小频繁发生变化(导致频繁重绘), 绘制消耗的时间可能会增加并成为性能瓶颈.

减少绘制时间的一个方法是将一个复杂路径切分为多个简单路径. 使用多个简单的CAShapeLayer对象进行组合比直接使用一个复杂对象渲染的更快. 这是因为绘图操作在CPU上完成, 而合成操作在GPU上完成.

为多个图层设置相同的内容

如果要在多个图层对象中使用相同的图片, 可以只加载一次图片, 然后将图片同时赋值给这些图层的contents属性. 这样图层会直接使用该图层作为后备存储(backing store), 而不是重新分配内存.

尽可能设置图层宽高为整数

将图层的宽高设置为整数可以简化Core Animation在创建和管理后备存储以及维护其他一些图层信息时的工作.

合理使用异步渲染

任何在drawLayer:inContext:drawRect:方法中的绘制行为都在主线程中进行. 在某些情况下, 可以尝试开启drawsAsynchronously属性将绘制操作切换到后台线程中执行, 但必须确保这些绘制是线程安全的.

使用阴影路径添加阴影

Core Animation确认阴影形状并生成阴影的代价是十分昂贵的, 应尽量使用shadowPath属性显式的指定阴影形状. 设置该属性后, Core Animation会根据设置的阴影形状绘制和缓存阴影效果.