iOS Rendering 渲染解析,问题解答

1、 CPU 和 GPU 的设计目的分别是什么?

cpu是用于复杂逻辑计算和控制

拥有四个部分 control cache alu dram
其中cache占比比较大 串行计算 低延时设计。

dram 是动态随机存取存储器(Dynamic Random Access Memory,DRAM)是一种半导体记忆体

gpu 图形处理中心
可以进行多线程 高并发
简单计算 大吞吐量


2、 CPU 和 GPU 哪个的 Cache、ALU、Control 单元 unit 的比例更高?

cpu cache高

gpu alu 比例高
计算单元 Arithmetic Logic Unit

3、 计算机图像渲染流水线的大致流程是什么?

图元-顶点着色器-线条着色器
-几何着色器-光栅化-片段着色器
-测试与混合

图像在应用中被处理的阶段,此时还处于 CPU 负责的时期。在这个阶段应用可能会对图像进行一系列的操作或者改变,最终将新的图像信息传给下一阶段。这部分信息被叫做图元(primitives),通常是三角形、线段、顶点等


4、 Framebuffer 帧缓冲器的作用是什么?

存储通过gpu处理后的bitmap

5、 Screen Tearing 屏幕撕裂是怎么造成的?

当显示器电子束重新开始下一帧的扫描时
帧缓冲器里的bitmap还没有ready
此时扫描出来的是上一帧的内容
然后帧处理器的bitmap被替换
也就是扫了一半就变成了新的bitmap
这样展示的内容就是上一帧和当前帧的拼接

6、 如何解决屏幕撕裂的问题?

为了解决这个问题,GPU 通常有一个机制叫做垂直同步(简写也是 V-Sync),当开启垂直同步后,GPU 会等待显示器的 VSync 信号发出后,才进行新的一帧渲染和缓冲区更新。这样能解决画面撕裂现象,也增加了画面流畅度,但需要消费更多的计算资源,也会带来部分延迟。

vsync 垂直同步信号,
每次电子束结束屏幕的扫描,
显示器会发送一个vsync给frame buffer,
然后frame buffer才会读取新的frame


7、 掉帧是怎么产生的?

电子束结束当前frame的display
但是 gpu还没有处理完
没有新的bitmap
所以还会展示之前的frame

8、 CoreAnimation 的职责是什么?

Render, compose, and animate visual elements

9、 UIView 和 CALayer 是什么关系?有什么区别?

uiview负责交互 管理子视图 还有展示;

calayer负责存储bitmap


10、 为什么会同时有 UIView 和 CALayer,能否合成一个?

职责分明 便于复用

11、 渲染流水线中,CPU 会负责哪些任务?

handle event
commit transaction
decode
draw calls

12、 离屏渲染为什么会有效率问题?
新开辟一块新的内存空间
offscreen buffer和frame buffer内容交换代价


13、 什么时候应该使用离屏渲染?

需要保存中间渲染过程;效率考虑可以将屏幕外的内容预先渲染好保存,达到复用

14、 shouldRasterize 光栅化是什么?

光栅化:光,颜色与亮度,就是显示。栅,屏幕就是栅格

是layer 的一个离屏渲染属性,如果存在切圆角、阴影、组透明度这些系统会默认开。该属性开启后在renderer server中会将生成的bitmap进行保存

15、 有哪些常见的触发离屏渲染的情况?

圆角,阴影,组透明度


16、 cornerRadius 设置圆角会触发离屏渲染吗?

不会

这个之后在background和border上生效

content不会切圆角

需要设置masktobounds或者cliptobounds为yes

才会触发

17、 圆角触发的离屏渲染有哪些解决方案?

图片自带圆角、
增加mask在最上层、
贝塞尔曲线、
drawrect重写

18、 重写 drawRect 方法会触发离屏渲染吗?

不会

会将gpu工作转移到cpu
所以存在效率问题


你可能感兴趣的:(ios)