调用setNeedsDispaly时候,实际上是这个view的layer调用setNeedsDispaly方法,之后相当于在这个layer上打上一个脏标记,然后并没有立即发生当前视图的绘制工作,而是在当前runloop快要结束的时候调用CALayer的display方法,进入到当前视图真正的绘制工作的流程当中。
原因是要减少绘制次数,提升性能,所以要在当前runloop快要结束的时候调用CALayer的display方法。
然后代理必须至少实现两个方法的其中一个,如果都实现,则调用displayLayer方法。
系统绘制流程原理图中的系统绘制流程就如上图所示,图中的backing store可以理解为要上传的位图,由CALayer传给GPU。
关于如何实现异步绘制。
我们基于图1中的[layer.delegate displayLayer:]方法有以下两点:
-代理负责生成对应的bitmap。
-设置该bitmap作为layer.contents属性的值。
异步绘制原理时序图通过上面的时序图来了解异步绘制。
通过子线程的切换,借助global queue,在子线程中进行bitmap的绘制,此时主线程可以做其他的工作。等子线程绘制位图完毕,再回到主队列中提交位图,设置给CALayer的contents属性,完成一个空间的异步绘制过程。
网友评论