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,6 +1,9 @@
# 离屏渲染
## 什么是离屏渲染
什么是在屏渲染?
在当前屏幕渲染,指的是 GPU 的渲染操作是在当前用于显示的屏幕缓冲区中进行的。
如果要在显示屏上显示内容,我们至少需要一块与屏幕像素数据量一样大的 Frame Buffer帧缓冲区作为像素数据存储区域然后由显示控制器把帧缓冲区的数据显示到屏幕上。如果因为面临一些限制比如阴影、光栅、遮罩等CPU 无法把渲染结果直接写入 Frame Buffer而是先暂时把中间的临时状态保存在额外的内存区域之后再写入 Frame Buffer那么这个过程被称为离屏渲染。
系统如果没有直接把渲染结果直接写入到 GPU FrameBuffer 中则认为发生了一次离屏渲染。离屏渲染指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
@@ -60,13 +63,17 @@ self.imageView.layer.cornerRadius = YES;
```
## 离屏渲染的影响?
触发离屏渲染后,会增加 GPU 的工作量CPU + GPU 工作时间可能会超过一次渲染周期,会发生 UI 卡顿。
离屏渲染,指的是 GPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。由上面的一个结论视图和圆角的大小对帧率并没有什么影响,数量的多少才显著影响性能。可以知道离屏渲染耗时是发生在离屏这个动作上面,而不是渲染。为什么离屏这么耗时?原因主要有创建缓冲区和上下文切换。创建新的缓冲区代价都不算大,付出最大代价的是上下文切换。
上下文切换不管是在GPU渲染过程中还是广为人知的进程切换上下文切换都是一个相当耗时的操作。首先要保存当前屏幕渲染环境然后切换到一个新的绘制环境申请绘制资源初始化环境然后开始一个绘制绘制完毕后销毁这个绘制环境如需要切换到On-Screen Rendering 或者再开始一个新的离屏渲染重复之前的操作。
一次mask发生了两次离屏渲染和一次主屏渲染。即使忽略昂贵的上下文切换一次mask需要渲染三次才能在屏幕上显示这已经是普通视图显示3陪耗时若再加上下文环境切换一次mask就是普通渲染的nn>3倍以上耗时操作
一次 mask 发生了两次离屏渲染和一次主屏渲染。即使忽略昂贵的上下文切换一次mask需要渲染三次才能在屏幕上显示这已经是普通视图显示3陪耗时若再加上下文环境切换一次 mask 就是普通渲染的nn>3倍以上耗时操作
正常流程App Source Code -> CPU -> Frame Buffer -> Dispaly
离屏渲染流程App Source Code -> CPU -> Off Screen Frame Buffer -> Frame Buffer -> Dispaly
## 如何优化?
- 针对 shadow 可以增加 shadowPath
- 针对圆角可以增加贝塞尔曲线或者一张图片实现(类似遮罩)。