1、iOS的CoreAnimation并非只是一些动画API,本质上是控制图层的分解、存储和管理体系。会涉及绘图、效率等问题。
2、CALayer同UIView类似都是一些被层级关系树管理的矩形块,并管理子图层位置,都可以包含图片、文字等内容,并有一些API来做动画。最大的不同是CALayer不能处理用户交互。每个UIView都有对应的layer图层并可以添加更多图层,真正的动画是layer实现,UIView是对其的一个封装。并且是一种抽象类时候对功能的分离。
3、drawRect:如果方法被调用哦,就会为视图分配一个寄宿图,大小等于视图大小*contentScale。会造成cpu资源和内存的浪费。
4、通常将图像处理、屏幕渲染交给GPU处理会更快,但是如果GPU资源占用过高,性能就会开始下降。
5、图层绘制效率影响:
a太多的几何结构
b重绘,主要是重叠的半透明图层
c离屏绘制
d图片过大
6、问题查找:
使用xcode工具
Time Profilter 查看函数耗时时间
CoreAnimation查看离屏渲染、图层混合度,
OpenGL ES Driver 查看GPU占用率
7、优化方案
a禁止在不断变动的图层上面进行光栅化(shouldRasterize),在不变的地方设置为YES,其优点是将一个固定的图层体系折叠成单张图片,并进行缓存,这样就不需要每一帧重新合成。
b避免重绘、例如避免frame的改变
c控制离屏渲染数量
d自动布局会增加cpu开销
d cornerRadius和maskToBounds同时作用时会触发离屏渲染,如果要避免可采用CAShaperLayer画矩形
总之,要在速度与耗能之间进行平衡,GPU和CPU之间平衡