feature: dyld && LD 链接器

This commit is contained in:
杭城小刘
2024-06-29 16:00:34 +08:00
parent 1a8659e143
commit 13f7457be9
367 changed files with 12893 additions and 3049 deletions

View File

@@ -1,5 +1,60 @@
# iOS 界面渲染流程
> 下面几个问题你熟悉吗?
>
> - 为什么调用 `[UIView serNeedsDisplay]` 并没有立刻发生当前视图的绘制工作?
## 视图显示原理
为什么调用 `[UIView setNeedsDisplay]` 并没有立刻发生当前视图的绘制工作?
UIView 绘制流程。
<img src="./../assets/UIViewRefreshProcess.png" style="zoom:60%" />
当调用 UIView `[UIView setNeedsDisplay]` 方法时,系统会立刻调用其 Layer 的同名方法 `[view.layer setNeedsDisplay]` 方法,之后相当于给当前 Layer 打上一个脏标记,之后会在当前 RunLoop 快要结束的时候才会调用 Layer 的 `[CALayer display]` 方法。然后进入当前 UIView 真正的绘制流程中。
其次,会判断 CALayer 的代理,有没有实现 `displayLayer:` 方法,如果没有实现,则进入系统的绘制流程中;如果实现了,则可能是异步绘制或者自定义渲染的实现。
Tips`[UIView setNeedsDisplay]` 之后并不会立马调用 `[view.layer setNeedsDisplay]` 方法。要么手动触发 `[view.layer setNeedsDisplay]` 要么,调用一下 `-(void)drawRect:(CGRect)rect` 方法(即使是空实现也没关系)。
下面来个 Demo 展示下简单的异步绘制一个 String。
<img src="./../assets/AsyncUILabelRender.png" style="zoom:30%" />
接下来看看系统的绘制实现流程:
<img src="./../assets/UIViewSystemRenderProcess.png" style="zoom:60%" />
如何实现异步绘制?
`[layer.delegate displayPlayer:]`
- 代理负责生成对应的 bitmap
- 设置该 bitmap 作为 layer.contents 属性的值
<img src='./../assets/AsyncRenderProcessAPI.png' style="zoom:30%" />
## 渲染机制
![](https://github.com/FantasticLBP/knowledge-kit/raw/master/assets/RenderStructure.png)