我想很多人在面试中都会被问到离屏渲染。更会有人说使用cornerRadius clipsToBounds或maskToBounds的时候会触发离屏渲染,但是真相真的是这样么?下面我们深入的了解一下离屏渲染。
一.什么是离屏渲染


正常来讲,渲染流程是图1中,当然,我把流程简化了,具体来讲是GPU进⾏渲染->帧缓存区⾥ ->视频控制器->读取帧缓存区信息-> 数模转化->显示 ,但是,由于当帧缓冲区的数据不能直接被视频控制器扫描显示的时候,我们要额外的开辟一个缓冲区离屏缓冲区来存储我们不能第一时间交给视频控制器显示的数据,所以这个时候离屏缓冲区就出现了。
二.离屏渲染的触发条件
1. mask使用
2.allowsEdgeAntialiasing
3. allowsGroupOpacity
4.shadows
5.shouldRasterize
上面的API方法在使用的时候会触发离屏渲染。除了上面说的这几种之外,我们所熟知的使用cornerRadius clipsToBounds或maskToBounds的时候一定会触发离屏渲染么?下面我们就做一个测试:

我们使用模拟器运行,并选中Color Offscreen-Rendered选项

之后我们有了如下发现,只有1和3出现了离屏渲染,这是为什么呢????

究其缘由,我们就又讲到了咱们的渲染流程:

如上图,我们在渲染一个图片的时候是遵循油画算法进行渲染的,比如第一步先帧缓存区中取出一个小山,然后进行渲染后清空,第二部是从帧缓存区取出草地,进行渲染,然后清空,然后第三部从帧缓存区中取出树木进行渲染,最后叠加后形成了最终图像,但是,如果有切圆角的任务的时候会是怎样呢?那就需要说到离屏渲染缓冲区了,因为帧缓存区每次渲染后都会进行清空,所以系统会自己开辟一个缓冲区->离屏渲染缓冲区去存储需要进行切圆角的图层,最后所有的图层都经过了这一操作后再一起渲染到屏幕上,这就出现了该缓冲区

而对于layer层来说,单独设置某个属性,比如background 或者border,然后进行圆角的裁切不会出现离屏渲染,因为我一次就可以渲染出来,就不需要再新开辟单独的缓冲区去进行存储,反之,如果设置了多个属性进行裁切,还会行程离屏渲染问题
上面,就是我所提到的离屏渲染问题