1.什么是离屏渲染

在使用圆角、阴影和遮罩等视图功能的时候,图层属性的混合体被指定为在未预合成之前不能直接在屏幕中绘制,所有就需要在屏幕外的上下文中渲染,即离屏渲染。

2.UIView和CALayer的关系

UIView继承UIResponder,可以处理系统传递过来的事件,每个UIView内部都有一个CALayer提供内容的绘制和显示

CALayer继承NSObject类,负责UIView提供内容的contents。CALayer有三个视图元素:背景色,内容,边框。其中内容的本质就是一个CGImage

3.界面渲染过程

Runloop有一个60fps的回调,即每16.7ms绘制一次屏幕,所以view的绘制必须在这个时间内完成,view内容的绘制是cpu的工作,然后把绘制的内容交给GPU渲染,包括多个view的拼接,纹理的渲染等,最后显示在屏幕上,但是,如果无法在16.7ms内容完成绘制,就会出现丢帧的问题,一般情况下,如果帧率保证在30fps以上,界面卡顿效果不明显。

渲染过程如下:

UIView的layer层有一个content,指向一块缓存

UIView绘制时会调用drawRect方法,通过context将内容写入缓存

在缓存写完后,通过renderserver交给GPU去渲染,将缓存中的bitmap数据显示在屏幕上

4.离屏渲染卡顿的原因:

离屏渲染之所以会特别消耗性能,是因为要创建一个屏幕外的缓存区,然后从当前屏幕缓存区切换到屏幕外的缓存区,然后再完成渲染。其中切换缓存区和切换上下文最消耗性能,而绘制不是性能消耗的主要原因。设置以下属性,就会触发离屏绘制:

光栅化/遮罩/阴影/抗锯齿/不透明/圆角/渐变

5.屏幕渲染类型:

CPU计算好显示内容提交到GPU,GPU渲染完成后将渲染结果放到帧缓存区,随后视频控制器会按照VSync信号逐行读取帧缓存区的数据。

当前屏幕渲染:GPU渲染操作就是在当前用于显示的屏幕缓冲区中

离屏渲染:GPU在当前屏幕缓冲区以外开辟一个新的缓冲区进行渲染操作

CPU的离屏渲染:重写drawrect方法,并且使用任何CoreGraphics的技术进行了绘制操作,就设计到了cpu渲染。