美文网首页
异步绘制原理

异步绘制原理

作者: leejnull | 来源:发表于2020-03-09 10:46 被阅读0次

UI绘制的过程

UI绘制原理的过程.png

当调用[UIView setNeedsDisplay]方法时,系统会立即调用对应的layer的setNeedsDisplay,之后给layer打上标记,在一次RunLoop将要结束时,会调用[CALayer display]方法,然后进入到真正的绘制过程当中。

[CALayer display]方法内部实现中,会判断有没有layer的delegate响应了displayLayer方法,如果没有会执行系统绘制流程,如果响应了就为我们提供了异步绘制的入口。

系统绘制流程

在CALayer内部会创建一个backing store(CGContextRef),然后layer会判断它是否有代理,如果没有代理的话,会调用[CALayer drawInContext:], 如果有代理,会调用[layer.delegate drawLayer: inContext],然后做当前视图的绘制工作,这部分是发生在系统内部的,然后在一个合适的时机给予我们一个回调方法,就是[UIView drawRect:][UIView drawRect:]的默认实现是什么都不做,给我们开一个口子,就允许我们在系统绘制的基础上做一些其他的相关的绘制工作,最后不论是哪个分支,都是由CALayer上传对应的backing store(可以理解为位图)到GPU

异步绘制

[layer.delegate drawLayer:inContext:]方法实现就可以进入到异步绘制的流程

  • 代理负责生产对应的bitmap
  • 设置该bitmap作为layer.contents属性的值

异步绘制的机制和流程

异步绘制的机制和流程.png

在调用setNeedsDisplay方法之后,在当前RunLoop快要结束时,由系统调用视图所对应的CALayer的display方法,然后如果代理实现了displayLayer:函数,会调用代理的displayLayer:函数方法,然后会通过子线程的切换,在子线程中做位图的绘制,此时主线程可以做别的事。

在全局并发队列子线程中

  1. 通过CGBitmapContextCreate()函数来创建一个位图的上下文
  2. 通过CoreGraphics的相关api做当前UI空间的绘制工作
  3. 再通过CGBitmapContextCreateImage()函数来根据当前所绘制的上下文,生成一张CGImage图片
  4. 然后回到主队列中提交位图,设置给CALayer的contents属性,这样就完成了一个UI控件的异步绘制

来自 https://leejnull.github.io/2020/03/09/2020-03-09-01/

相关文章

  • UIView绘制原理&异步绘制

    绘制原理 异步绘制流程

  • 常见面试问题概括

    UI视图相关 *TableView重用机制? 答: *视图绘制原理?如何实现异步绘制? 答:UIView绘制原理 ...

  • iOS UI 优化

    /* 1.UITableView 2.卡顿/掉帧 3.绘制原理/异步绘制 4.图像显示原理 ...

  • iOS 面试全方位剖析 -- UI视图篇(二)

    UITableView相关 事件传递&视图响应 图像显示原理 (一) 卡顿&掉帧 绘制原理&异步绘制 离屏渲染 ...

  • 异步绘制原理

    UI绘制的过程 当调用[UIView setNeedsDisplay]方法时,系统会立即调用对应的layer的se...

  • # UI视图相关

    UI视图相关 UITableView 事件传递&视图响应 图像显示原理 卡顿&掉帧 绘制原理&异步绘制 离屏渲染 ...

  • iOS体系

    UI视图 UITableView 事件传递&视图响应 图像显示原理 UI卡顿、掉帧 UI绘制原理/异步绘制 离屏渲...

  • UI视图

    UI视图考点: UITableView相关 事件传递&视图响应 图像显示原理 卡顿&掉帧 绘制原理&异步绘制 离屏渲染

  • iOS开发笔记-绘制原理和异步绘制

    了解iOS的绘制原理可以让你在自定义绘制内容时更得心应手,理解掉帧原理和异步绘制原理,让你的面试得心应手。http...

  • UIView绘制原理,异步绘制

    UIView绘制原理 首先看一幅流程图 CALayer的display方法的内部实现,首先会判断layer的del...

网友评论

      本文标题:异步绘制原理

      本文链接:https://www.haomeiwen.com/subject/dkjudhtx.html