UITableView相关
重用机制
- 字母索引条
数据源同步问题
-
并发访问、数据拷贝
-
串行访问
事件传递&视图响应
UIView和CALayer
-
UIView 为其提供内容,以及负责处理触摸事件,参与响应链
-
CALayer负责显示内容contents
设计模式:单一职责原则(职责分工)
事件传递
- (UIView*)hitTest:(CGPoint)pointwithEvent:(UIEvent*)event
- (BOOL)pointInside:(CGPoint)pointwithEvent:(UIEvent*)event
image
点击屏幕 -> UIApplication -> UIWindow -> hitTest:withEvent: -> pointInside:withEvent:
override func touchesBegan(_touches:Set, with event:UIEvent?)
override func touchesMoved(_touches:Set, with event:UIEvent?)
override func touchesCancelled(_touches:Set, with event:UIEvent?)
没有处理的事件 就会丢弃,不是引起崩溃 Tip(和方法找不到区分开)
图像显示原理
经过CPU、GPU、Frame Buffer(帧缓冲区)、视频控制器、显示器
CPU: Layout -> Display -> Prepare -> Commit
- Layout: UI布局和文本计算
- Display:绘制(drawRect:)
- Prepare:图片编解码
- Commit:提交位图
GPU渲染管线
- 顶点着色
- 图元装配
- 光栅化
- 片段着色
- 片段处理
卡顿&掉帧
image滑动优化方案
CPU:
- 对象的创建、调整、销毁
- 预排版(布局计算、文本计算)
- 预渲染(文本等异步绘制,图片编解码等)
GPU:
- 纹理渲染*(离屏渲染)
- 视图混合*
绘制原理&异步绘制
image离屏渲染
- On-Screen Rendering
意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行
- Off-Screen Rendering
意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
何时会触发?
-
圆角(当和maskToBounds一起使用时)
-
图层蒙版
-
阴影
-
光栅化
为何要避免?
会增加GPU的工作量,导致CPU+GPU的工作时间大于16.7ms 造成卡顿、掉帧
网友评论