UI视图相关
-
UITableView 相关
- 重用机制
- 数据源同步(新闻类app, 数据删除)
- 并发访问
- 串行访问
-
时间传递&视图响应
-
UIView&CALayer的区别(单一职责原则)
- UIView为其提供内容, 以及负责处理触摸事件,参与响应者链
-
CALayer负责显示内容contents
-
事件传递过程
-
主要分为以下
1. -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event <返回触摸的view> 2. -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event <当前触摸点是否在view内>
-
view 处理触摸事件的流程:
点击屏幕 -->
UIApplication-->UIWindow-->hitTest-->pointInside-->Subviews--> [UIView/其他同等级的UIView] --> 倒序遍历subviews -->hit = [sub hitTest:p withEvent:e]; --> hit != nill --> return hit --> end

事件传递过程
-
hitTest:withEvent 内部实现原理
hittest内部执行过程
-
视图事件响应
//- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event (触摸开始) //- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event (触摸移动) //- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event (触摸结束) //- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event (触摸取消)
-
图像显示原理
image.pngCPU通过UIView的CALayer图层 (CALayer的contents属性) 调用drawRect:方法绘制视图,通过CoreAnimation传递到GPU的OpenGL(ES)渲染到屏幕上image.png
GPU渲染包括: 顶点着色, 图元装配, 光栅化, 片段着色, 片段处理

image.png
-
UI卡顿&掉帧
原因: 在正常情况下,视图刷新率应该是60FPS,即每秒刷新
60下,CPU和GPU在每帧的规定时间内要完成UI的处理(UI排版,文字处理, 图片解码,合并图层)以便于在下次刷新信号来临的时候及时渲染到页面上. -
滑动优化方案
-
CPU
- 对象的创建,调整,销毁等在子线程处理
- UI的预排版(布局计算, 文本计算))
- 预渲染(文本等异步绘制,图片的编解码等操作)
-
GPU
- 纹理渲染
- 视图合并混合等
-
-
绘制原理&异步绘制
-
为什么在调用
setNeedsDisplay的时候, 视图没有立即刷新-
当调用view 的
setNeedsDisplay方法时, 底层会调用layer的同名方法(view.layer setNeedsDisplay),在
runloop将要结束的时候, 就会调用[CALayer display]方法去刷新UI
image.png -
如何实现异步绘制
需要手动实现layer的代理方法displayLayer
手动实现layer的代理方法,
主线程会开子线程去处理bitmap对象,并通过coreGraphic相关api处理上下文, 并生成图片返回给主队列, 主队列赋值layer的contents属性用于显示- 代理负责生成对应的
bitmap - 设置该bitmap作为
layer.contents属性的值
- 代理负责生成对应的
image.png -
-
-
离屏渲染
-
定义
- 在屏渲染(
on-screen-rendering): 指GPU的渲染操作在当前屏幕缓冲区内进行 - 离屏渲染(
off-screen-rendering): 指GPU在当前屏幕缓冲区外有另开辟缓冲区进行渲染操作.
- 在屏渲染(
-
何时出发
- 设置view的圆角(并与
maskToBounds为YES) - 图层蒙版
- 阴影
- 光栅化
- 设置view的圆角(并与
-
为何要避免离屏渲染
- 在触发离屏渲染的时候,
GPU开辟额外缓冲区进行渲染操作,增加了处理时长,导致UI的卡顿和掉帧
- 在触发离屏渲染的时候,
-




