注意:本文主讲UI相关面试问题,包括UITableView相关、事件传递&视图相应、图像显示原理、卡顿&掉帧、绘制原理&异步绘制、离屏渲染。
一、UITableView相关
1、重用机制
2、数据源同步
(1)、数据源同步问题
(2)、数据源同步解决方案
1>、并发访问、数据拷贝
2>、串行访问
二、事件传递&视图相应
1、UIView和CALayer的关系
UIView为其提供内容,以及负责处理触摸等事件,参与响应链。
CALayer负责显示内容contents
三、图像显示原理
1、CPU工作
Layout(UI布局、文本计算); Display(绘制,drawRect方法);Prepare(图片编解码); Commit(提交位图)。
2、GPU渲染管线(openGL)
顶点着色、图元装配、光栅化、片段着色、片段处理。
四、卡顿&掉帧
1、原因
2、优化方案
(1)、CPU
对象创建、调整、销毁;
预排版(布局计算、文本计算);
预渲染(文本等异步绘制,图片编解码等)。
(2)、GPU
纹理渲染(离屏渲染);
视图混合(视图层级复杂度,GPU需要做每个视图的合成)。
五、绘制原理&异步绘制
一、系统绘制流程
二、异步绘制
-[layer.delegate displayLayer:]
代理负责生成对应的bitmap
设置该bitmap作为layer.contents属性的值
六、离屏渲染
1、啥是离屏渲染?
当设置某一些UI视图的图层属性时,如果未被预合成之前不能用于当前屏幕直接显示的时候,就会触发离屏渲染。而离屏渲染的概念起源于GPU层面,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
当屏渲染:指的是GPU的渲染操作是在当前用于显示的屏幕缓存区中进行。
2、何时会触发?
(1)、圆角(当和maskToBounds一起使用时)
(2)、图层蒙版
(3)、阴影
(4)、光栅化
3、为何要避免?
(1)、会增加GPU的工作量,会导致CPU和GPU的工作总耗时超过16.7毫秒,会导致UI的卡顿和掉帧。
(2)、创建新的渲染缓冲区,会内存开销。
(3)、上下文切换,会导致GPU额外开销。
最后总结点东西吧,面试官经常问的问题有:
1、系统的UI事件传递机制是咋样的?
2、使UITableView滚动更流畅的方案或思路都有哪些?
3、什么是离屏渲染?
4、UIView和CALayer之间的关系是咋样的?