iOS离屏渲染原理
1.什么是离屏渲染
说到离屏渲染,那我们就要说一下苹果的渲染方式有哪些,首先苹果这边渲染方式主要有两种On-Screen Rendering (当前屏幕渲染) 和Off-Screen Rendering (离屏渲染).
1.Screen Rendering (当前屏幕渲染)
指的是GPU的渲染操作是在用于显示的屏幕缓冲区中进行,不需要额外创建新的缓存,也不需要开启新的上下文,所以性能较好,但是收到缓存大小限制等因素,一些复杂的操作无法完成。
2.Off-Screen Rendering (离屏渲染)
指的是在GPU的当前屏幕缓冲区外开辟新的缓冲区进行操作。
3.为什么会发生离屏渲染?
首先为什么要开辟离屏渲染,为什么不能使用Screen Rendering (当前屏幕渲染)直接渲染,首先在我们知道Screen Rendering (当前屏幕渲染)是直接从屏幕的帧缓冲区去读取图片信息然后展示,但是一些比较复杂的UI会被分解成多个图层分别绘制,例如蒙版,但是帧缓冲区并不会一直保存着之前绘制的图片的信息,绘制完成以后就被丢弃掉了,这样当我们对一个ImageView用layer.cornerRadius + layer.masksToBounds 切圆角的时候如果有背景色的情况下他其实是对背景图层和图片图层分别切,但是背景图层已经被丢弃了掉了,这个时候就无法完成对ImageView去切圆角,所以我们就要有一个单独的缓冲区来吧这两个图层的信息存下来,以便于后续的操作,所以这个时候就发生了离屏渲染.
2.常见发生离屏渲染的情况
1.使用了 mask 的 layer (layer.mask)
2.需要进行裁剪的 layer (layer.masksToBounds /view.clipsToBounds)
3.设置了组透明度为 YES,并且透明度不为 1 的layer (layer.allowsGroupOpacity/ layer.opacity)
4.添加了投影的 layer (layer.shadow*)
5.采用了光栅化的 layer (layer.shouldRasterize)
6.绘制了文字的 layer (UILabel, CATextLayer, Core Text 等)
3.如何看一个图层是否发生离屏渲染
选中跑起来项目的模拟器 ——> Debug ——> Color Off-screen Rendered
4.结合以下案例看结果
由此可以看出并不是说用了masksToBounds或clipsToBounds就一定会发生离屏渲染,当图层有多个并且发生了masksToBounds或clipsToBounds或者阴影等才会发生离屏渲染,就此说明阴影和边框和背景在渲染时也是单独的图层,可以参照以下图片