- UITableView重用机制,重点“重用池”
-
UITableView的数据源异步操作,可以使用队列方式,如下图:
UITabeleView的异步处理数据源操作 - UIView和CALayer的关系
- UIView为其提供内容,以及负责处理触摸等事件,参与响应链
- CALayer负责显示内容contents
这种方式符合设计模式中的单一职能原则
- 事件传递
在事件传递中核心关键点就是会调用到:
- (UIView *)hitTest:(CGPoint)point with Event:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
这两个方法,第一个方法用于找出事件的响应者,第二个方法用于确定事件触发的位置。
通过这两个方法来做事件的传递和响应过程,如下图:
事件传递
hittest方法内部会进行一个递归调用,对响应者的所有subviews调用hittest,如下图:
hitTest的系统实现
-
图像显示原理
图像显示原理
可以看到,CPU处理了UI布局,绘制,以及图片编解码等预处理工作,最后将bitmap位图提交给GPU进行屏幕渲染。
-
UI卡顿、掉帧的原因
屏幕的刷新频率是60帧,即每16.7ms就会进行一次屏幕刷新,如果此时系统中绘制渲染工作还没有完成,则会将显示拖延到下一个刷新点,这样就会造成掉帧,如下图中的这种情况:
UI卡顿、掉帧的原因 - 优化方案
- CPU
对象创建、调整、销毁
预排版(布局计算、文本计算)
预渲染(文本等异步绘制,图片编解码) - GPU
纹理渲染
视图混合(在绘制时减少图层层级,将多个层级绘制到一个层级下,以减少GPU在做视图混合时消耗的时间)
UIView的绘制原理
UIView的绘制原理
CALayer会在当前loop结束前调用自身的display方法进行绘制,下图是系统调用CALayer的display方法绘制的流程:
CALayer的系统绘制流程
UIView的drawRect方法是一个空方法,他给调用者提供了一个在系统绘制的基础上二次操作的空间。
bitmap作为layer的contents属性的值,在被赋值后提交给GPU进行渲染。
我们可以在displayLayer方法中进行异步绘制。
异步绘制
- 离屏渲染
- On-Screen Rendering
意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行 - Off-Screen Rendering
意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
何时会触发?
- 圆角(当和maskToBounds一起使用时)
- 图层蒙版
- 阴影
由于离屏渲染要创建新的渲染缓冲区,同时还要进行上下文的切换,这会增加GPU的处理时间,可能会造成掉帧