离屏渲染原理
App进行额外的渲染和合并 —> offscreen Buffer 组合 —> FrameBuffer —> 屏幕
离屏渲染流程
遮罩触发离屏渲染
离屏渲染产生的性能问题
- 需要额外的存储空间
-
offscreen Buffer
到FrameBuffer
需要时间 -
offscreen Buffer
有空间限制 一般为屏幕像素的2.5倍
大量的离屏渲染容易产生程序卡顿及额外的性能消耗
离屏渲染的作用
- 特殊效果(遮罩等特效) 需要使用额外的
offscreen Buffer
保存中间状态,不得不使用离屏渲染。
常见的系统自动触发的离屏渲染
使用了遮罩的layer
layer.mask
添加了投影的layerlayer.shadow
使用了光栅化的layerlayer. shouldRasterize
需要进行裁剪的layerlayer.masksToBounds
设置了组透明度为YES,且透明度不为1的layerlayer.allowsGroupOpacity
/layer.opacity
绘制了文字的layerUILabel
,Core Text
,CATextLayer
等
- 效率的优势:多次出现在屏幕上出现的效果,可以提前渲染保存在
offscreen Buffer
中,达到复用的目的。
shouldRasterize 光栅化
光栅化使用建议
- 如果layer不能被复用,则没有必要打开光栅化
- 如果layer不是静态的,需要被频繁修改,比如处于动画之中,那么开启离屏渲染反而影响效率了
- 离屏渲染缓存内容有时间限制,缓存内容100ms如果没有被使用,那么它就会丢弃,无法进行复用
- 离屏渲染缓存空间有限,超过2.5倍屏幕像素大小,也会失败,且无法进行复用
圆角触发的离屏渲染
圆角触发的离屏渲染属性解读
view.layer.cornerRadius = 2;
- 绘制图层背景圆角时使用的半径,可设置动画
- 设置
layer.cornerRadius
只会设置backgroundColor
和border
的圆角,不会设置content
的圆角,除非同时设置了layer.maskToBounds = YES
(对应view
中的clipsToBounds = YES
)
触发离屏渲染的原因
view.layer.masksToBounds = YES;
画家算法
图层由远及近进行渲染。
普通渲染和离屏渲染
普通的渲染逻辑
当sublayer绘制到屏幕上之后,就会将sublayer从帧缓存区中移除,节省空间
离屏渲染逻辑
-
将数据存放在
将数据存放在offscreen Buffer中offscreen Buffer
中
-
从
分别处理offscreen Buffer
中分别拿到所有内容圆角处理后,再进行组个,最后渲染在屏幕上
总结
大于等于2个图层叠加并且需要进行组合、圆角、融合、遮罩等操作时,就会触发离屏渲染
网友评论