##一、离屏渲染概念
1、当前屏幕渲染
指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
2、离屏渲染
GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染,这就涉及到上下文的切换。
##二、何时会触发
###1、触发时机:圆角+(maskToBounds)、图层蒙版、阴影、光栅化。
原因:当使用圆角,阴影,遮罩的时候,图层属性的混合体在未预合成之前不能直接在屏幕中绘制,即当主屏的还没有绘制好的时候,所以就需要屏幕外渲染,最后当主屏已经绘制完成的时候,再将离屏的内容转移至主屏上。
###2、为什么要避免离屏渲染
####初中级工程师:
4.1 创建新的缓冲区
4.2 上下文切换
详细解释:先是从当前屏幕切换到离屏,等到离屏渲染结束后,将离屏缓冲区的渲染结果显示到屏幕上需要上下文环境从当前屏幕切换到主屏幕。而上下文切换需要付出很大代价的。
因为有多通道的渲染管线,最终需要把多通道的渲染管线做一个合成,涉及到上下文切换,就有了GPU的额外开销。
####高级工程师:
回答点:UI卡顿和掉帧
触发离屏渲染的时候会增加GPU的工作量,会导致GPU和CPU的工作耗时加起来超出了16.7ms,导致UI的卡顿和掉帧。
####引申:
RunLoop是一个60fps的回调,也就是说每16.7ms绘制一次屏幕,也就是说我们需要在这个时间内完成View缓冲区的创建,View的内容绘制这些事CPU的工作,然后把缓冲区交给GPU绘制,这里包含了多个View的拼接,纹理的渲染等,最后display到屏幕上。但是如果你在16.7ms内做的事情太多,导致CPU、GPU无法在指定的时间内完成工作,那么就会出现卡顿现象,也即是丢帧。
实际上,60FPS是APP给出的最佳频率,实际上能达到30FPS就足够,60FPS更多的是用在游戏上。
注释:FPS(每秒传输帧数):Frames Per Second
frame:框架、画面
由于主流的屏幕刷新率都在60hz,因此渲染一帧的事件就必须控制在16.7ms内才能保证不掉帧。也就是说每一次渲染都要在 16.7ms 内页面才够流畅不会有卡顿感。
5、UIView和CALayer之间的关系?
UIView专门负责事件传递和事件响应的。
CALayer负责视图的显示。
引申:
用到了六大设计原则的单一职责原则。
单一职责原则:就一个类而言,应该只有一个引起它变化的原因。
单一职责是实现高内聚低耦合的指导方针。
知识点:http://www.cocoachina.com/ios/20160929/17673.html