什么是离屏渲染?
正常渲染的流程

- 正常的渲染是把数据丢给帧缓冲区然后显示到屏幕上。这个过程本着用完丢弃的原则,不做任何的存储。这样会提高性能。
如图:

离屏渲染的流程

- 离屏渲染是我们将图片数据进行合并整合后进行圆角或裁减等操作。最后在显示到屏幕上,但是正常的渲染流程不会做任何的存储,所以我们需要离屏缓冲区,先把数据放到离屏缓冲区,处理好的结果给到帧缓冲区。如图(图画的不好,懂我意思就可以了。。🤣):

离屏渲染的优缺点
离屏渲染的缺点
- 会影响性能:由于离屏缓冲区是额外开辟的存储数据的空间,将数据传到帧缓冲区多出一步转存的操作。
- 离屏缓冲区有空间上线:是屏幕像素的2.5倍。
离屏渲染的必要性
那么为什么离屏渲染会造成性能问题,我们还会使用呢?
- 处理一些特殊的效果:需要使用额外的off-screen Buffer保存中间状态,我们不得不使用。这种情况大多数是系统触发的。圆角、阴影等等
- 效率优势:如果一个效果可以多次实现,可以提前渲染,达到复用的目的。
圆⻆角触发的离屏渲染 offscreen Rendering
来一波图文说明(由于绘画技术有限,偷一波图)。。

- CALayer的构成有三部分,backgroundColor、contents、border。
- 大家设置圆角的时候时候都会来一波裁减。觉得这是规律了。真正的原因是,当开发者设置圆角cornerRadius时只会对backgroundColor和border设置圆角,但是contents容却不会,如果要设置contents圆角的话就要使用maskToBounds、clipsToBounds。这样就会触发离屏渲染。
注:并不是所有的圆角都会触发离屏渲染,必须满足,backgroundColor、contents、border同时圆角操作。
常见的几种触发离屏渲染的情况。
- 使用了 mask 的 layer (layer.mask)
- 需要进行裁剪的 layer (layer.masksToBounds / view.clipsToBounds)
- 设置了组透明度为 YES,并且透明度不为 1 的 layer (layer.allowsGroupOpacity/ layer.opacity)
- 添加了投影的 layer (layer.shadow*)
- 采用了光栅化的 layer (layer.shouldRasterize)
- 绘制了文字的 layer (UILabel, CATextLayer, Core Text 等)