一、渲染机制
CPU将计算好的需要显示的内容提交给GPU,GPU渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照Vsync(垂直脉冲)信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器进行显示。
二、GPU屏幕渲染有两种方式
离屏渲染Off-Screen Rendering 指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。离屏渲染结束后,再从离屏切到当前屏幕
当前屏幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
三、以下方式会触发离屏幕渲染
1.使用系统提供的圆角效果也会触发离屏渲染.
(masksToBounds = true&&cornerRadius>0才会引发离屏渲染)
2.重写drawRect
3.layer.shadow
(Shawdow 可以通过指定路径来取消离屏渲染)
4.layer.mask
(Mask 效果无法取消离屏渲染,使用混合图层的方法来模拟 mask 效果,性能各方面都是和无效果持平。)
5.layer.allowsGroupOpacity
(GroupOpacity 是指 CALayer 的allowsGroupOpacity属性,UIView 的alpha属性等同于 CALayer opacity属性,
开启离屏渲染的条件是:layer.opacity != 1.0并且有子 layer 或者背景图。)
layer.allowsEdgeAntialiasing
开启离屏渲染的条件是:layer.opacity != 1.0并且有子 layer 或者背景图。)
layer.allowsEdgeAntialiasing
(该属性用于消除锯齿,离屏渲染条件旋转视图并且设置layer.allowsEdgeAntialiasing = true)
6.layer.shouldRasterize
(光栅化会触发离屏渲染,开启 Rasterization=true 后,GPU 只合成一次内容,然后复用合成的结果;合成的内容超过 100ms 没有使用会从缓存里移除,在更新内容时还会产生更多的离屏渲染。对于内容不发生变化的视图,原本拖后腿的离屏渲染就成为了助力)
四、如何检测离屏渲染
1.模拟器
模拟器在工作栏上面的Debug -> Color Off-Screen Rendered
2.真机
真机在工作栏上面的Debug -> View Debugging -> Rendering -> Color Off-Screen Rendered Yellow