CALayer
UIView
= 绘制 + 响应触摸事件
- 负责屏幕和显示,不负责触摸事件响应链
UIView
是其高级封装- 和
UIView
层级一一对应
UIView
未暴露 CALayer
的接口
- 阴影,圆角,带颜色的边框
- 3D 变换
- 非矩形范围
- 透明遮罩
- 多级非线性动画
图形和几何
frame:外部坐标,父图层坐标,大小为边与 xy 轴平行能完全容纳图层的最小矩形
bounds:内部坐标,自身坐标,大小为图层大小的矩形
anchorPoint:锚点,旋转基点,左上角{0,0},右下角{1,1}
center(CALayer
的 position):anchorPoint 在父图层的坐标
视觉效果
拉伸过滤
以正确比例和 1:1 像素显示图片在屏幕上的好处
- 画质好,像素无压缩拉伸
- 更好使用内存
- 性能好,无需额外计算
CAShapeLayer
矢量图像而不是 bitmap 绘制图层子类
优点:
- 渲染快速,硬件加速
- 高效使用内存,占用小
- 不受边界裁剪,可在边界外绘制
- 不会出现像素化
CATextLayer
CALayer
的子类,几乎拥有 UILabel
所有绘制特性
渲染快于 UILabel
,运用 Core text
性能调优
动画和图层被单独的渲染服务进程处理
动画发生过程
- 布局
- 显示
- 准备-发送动画数据到渲染服务
- 提交-打包图层和动画属性发送到渲染服务
- 对所有图层属性计算中间值,设置 OpenGL 几何形状(纹理化三角形)进行渲染
- 在屏幕上渲染可见三角形(GPU 执行,前面都在 CPU)
可能影响GPU绘制的情况
- 过多几何结构
- 重绘-重叠半透明图层
- 离屏渲染-为屏幕外渲染的图片分配额外内存,切换屏幕内外的绘制上下文
- 过大的图片
可能影响CPU计算的情况
- 布局计算:自动布局
- 视图懒加载:涉及 IO 的图片显示
- Core Graphics 绘制:
drawRect
(为支持图层任意绘制需要在内存中创建一个等大小的寄宿图) - 解压图片
图像IO
- 线程加载:合适的后台线程
- 分辨率交换:移动时低分辨率,静态时加载高分辨率
- 缓存:考虑因素(合适缓存键、缓存时机、失效、回收)
- 图像格式
文本
尽可能避免改变文本的 frame,因为需要重绘
光栅化
将图层及其所有效果绘制成一个屏幕外的图像并缓存,避免运用在内容不断变动的图层上
离屏渲染
在混合复杂效果无法直接渲染时,会通过分步渲染,会把分布渲染的结果临时储存在屏幕外的内存中等待组合渲染
影响性能在于
- 为临时储存部分渲染结果分配内存
- 进行将渲染结果从屏幕内-外的上下文切换
图层的属性触发离屏渲染
- 圆角 + maskToBounds
- 图层蒙版
- 阴影
图层混合
- 设定固定不透明的背景颜色
- 设置 layer 的 opaue 属性默认为 YES(非 view 的)
颜色格式
苹果的 GPU 只解析 32bit 的颜色格式,其余的格式 CPU 会先进行颜色格式转换,再让 GPU 渲染。
图像大小缩放
image 和 imageView 的大小尽量保持一致,避免在改变 view 大小时重复计算缩放