我们知道iOS界面渲染需要依靠强大图像计算能力的GPU,但是GPU并不是万能的,过分依赖GPU往往会导致GPU的性能出现瓶颈,要么导致离屏渲染,严重时还会出现卡顿现象。为了减轻GPU的负担,我们有时也需要依靠CPU来进行协助绘制,这篇文章主要讲解CPU进行异步绘制的流程,部分内容摘录自iOS探索:UI视图之卡顿、掉帧及绘制原理
一、UIView的绘制原理(CPU绘制)
UIView绘制流程图:
UIView绘制流程以及异步绘制.png-
当我们调用
[UIView setNeedsDisplay]
这个方法时,其实并没有立即进行绘制工作,系统会立刻调用CALayer的同名方法,并且会在当前layer上打上一个标记,然后会在当前runloop将要结束的时候(下一个绘制周期)调用[CALayer display]
这个方法,然后进入我们视图的真正绘制过程 -
在
[CALayer display]
这个方法的内部实现中会判断这个layer的delegate是否响应displayLayer:
这个方法,如果响应这个方法,就会进入到系统绘制流程中;如果不响应这个方法,那么就会为我们提供异步绘制的入口 -
在异步绘制中,会先判断代理是否有实现协议的
drawLayer:inContext方法
,如果有实现,就会创建一个空的寄宿图和Core Craphics的绘制上下文,为绘制寄宿图做准备,然后会在一个合适的时候调用一个我们非常熟悉的方法[UIView drawRect:]
来获取寄宿图内容。[UIView drawRect:]
这个方法默认是什么都不做,系统给我们开这个口子是为了让我们可以再做一些其他的绘制工作 -
无论是哪个分支,最终都会由CALayer上传对应的backing store(寄宿图,也即位图bitmap)给GPU,然后就结束了本次绘制流程
网友评论