- On-Screen Rendering
意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
Off-Screen Rendering
离屏渲染,指的是GPU在当前屏幕缓冲区以为新开辟一个缓冲区进行渲染操作。
在使用圆角、阴影和遮罩等视图功能的时候,图层属性的混合体被指定为在未预合成之前不能直接在屏幕中绘制,所有就需要在屏幕外的上下文中渲染,即离屏渲染。
离屏渲染之所以耗性能,是因为要创建一个屏幕外的缓冲区,然后再完成渲染。其中创建缓冲区和切换上下文最消耗性能,绘制不是消耗性能的主要原因。
- 界面的渲染过程
RunLoop有一个60fps的回调,即每隔16.7ms绘制一次屏幕,所以view的绘制必须在这个时间内完成,view内容的绘制是cpu的工作,然后把绘制的内容交给GPU渲染包括多个view的拼接(Compositing),纹理渲染(Texture)等等,最后显示在屏幕上。
但是如果在16.7ms内无法完成绘制,就会出现丢帧情况,一般情况下如果帧率保持在30fps以上,界面的卡顿效果不明显,那么就需要在33.4ms内完成view的绘制,而低于这个帧率就会产生卡顿效果,影响体验。
- 渲染过程:
UIView 的layer层有一个content,指向一块缓存,即backing store。
UIView 的绘制时会调用drawRect方法,通过context将数据写入backing store。
在 backing store 写入完成后,通过 rending server 交给GPU 去渲染,将backing store 中的bitmap数据显示在屏幕上。
- 如何触发离屏渲染
- 圆角(maskToBounds = YES)单独设置一项不会触发离屏渲染。
- 蒙版
- 阴影
- 光栅化
参考