1、UITableView相关
(1) 重用机制
cell = [tableview dequeueReusableCellWithIdentifier:@"identifer"];
利用重用标识符,查看重用池中是否存在可复用的视图,如果没有,cell则返回nil,需要手动创建视图对象。
(2) 数据源同步
并发数据访问和串行队列两种解决方案。
2、事件传递&视图响应链
(1) UIView 和 CALayer
UIView为CALayer提供显示内容,以及负责处理触摸事件等,参与响应链。
CALayer只负责显示contents内容。
这样设计的原因是遵循:单一职责原则。
(2)事件传递
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
哪个视图响应这个事件,就返回哪个视图。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
用于判断某一个点击的位置,是否在这个视图范围内,如果在就返回yes,不在就返回no。
(3)视图事件响应
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
4、卡顿&掉帧
(1)UI卡顿掉帧的原因
Vsgnc 16·7ms,CPU和GPU必须在16.7ms的时间内,完成下一帧视图的合成,否则就会出现卡顿或掉帧的现象。
(2)滑动优化方案
CPU优化
1、对象的创建、调整、销毁尽量放到子线程去做
2、预排版(布局计算丶文本计算)
3、预渲染(文本等异步绘制丶图片编解码等)GPU优化
1、减少视图层级和视图混合。
2、触发离屏渲染,比如CALayer绘制圆角等,都会导致GPU耗时过长。尽量减少离屏渲染,利用好GPU的异步绘制机制。
5、绘制原理&异步绘制
(1)UIView的绘制原理
当调用 [UIview setNeedsDisplay] 时,不会立即重新绘制视图,而是在某一个时机绘制视图。
6、离屏渲染
什么是离屏渲染?
离屏渲染,指GPU的渲染操作是在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
什么是在屏渲染?
在屏渲染,指GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
何时会触发离屏渲染?
1、当设置圆角(当和maskToBounds一起使用时)触发!
2、图层蒙版
3、阴影
4、光栅化
为何要避免?
在触发离屏渲染的时候,会增加GPU的工作量。可能会导致GPU和CPU的总耗时超过16.7ms,造成卡顿和掉帧。