Skip to content

利用 Runloop 解释一下页面的渲染的过程? #115

@tbfungeek

Description

@tbfungeek
  • 当我们调用 [UIView setNeedsDisplay] 时,这时会调用当前 View.layer 的 [view.layer setNeedsDisplay]方法,给当前的 layer 打上了一个脏标记,表示后续这些View后续需要重绘,但是此时并没有直接进行绘制工作。而是会到当前的 Runloop 即将休眠,也就是 beforeWaiting 时才会进行绘制工作。

  • 当Runloop完成其他任务空闲下来将要进入休眠当时候会调用 [CALayer display],进入到真正绘制的工作。CALayer 层会判断自己的 delegate 有没有实现异步绘制的代理方法 displayer:,这个代理方法是异步绘制的入口,如果没有实现这个方法,那么会继续进行系统绘制的流程,然后绘制结束。

  • CALayer 内部会创建一个 Backing Store,用来获取图形上下文。接下来会判断这个 layer 是否有 delegate。如果有的话,会调用 [layer.delegate drawLayer:inContext:],并且会返回给我们 [UIView DrawRect:] 的回调,让我们在系统绘制的基础之上再做一些事情。如果没有 delegate,那么会调用 [CALayer drawInContext:]。

  • 以上两个分支,最终 CALayer 都会将位图提交到 Backing Store,最后提交给 GPU。至此绘制的过程结束。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions