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渲染。