iOS UI相关知识梳理
一、UIView和CALayer
- UIView为CALayer提供内容,以及处理触摸事件,参与响应链
- CALayer负责显示内容
二、事件传递和响应链
- 如果事件一直传递到UIApplication还是没处理,那么会忽略掉
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (UIView *)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
三、图像显示原理
- 1)原理
- 1、CPU输出位图
- 2、GPU图层渲染,纹理合成
- 3、把结果放到帧缓冲区中
- 4、再由视频控制器根据vsync信号在指定的时间前去提取缓冲区中的屏幕显示内容
- 5、显示到屏幕上
- 2)CPU工作
- 1、Layout:UI布局、文本计算
- 2、Display:绘制
- 3、Prepare:图片解码
- 4、Commit:提交位图
- 3)GPU
- 1、顶点着色、图元装配、光栅化、片段着色、片段处理
四、UI卡顿掉帧原因
- iOS硬件设备时钟会发出Vsync(垂直同步信号)信号,然后CPU会计算显示到屏幕的内容,之后将计算好的内容提交到GPU渲染。随后,GPU将渲染结果提交到帧缓冲区,等到下一个Vsync到来的时候讲内容显示到屏幕上。也就是说,一帧内容是由CPU和GPU共同决定的。一般来说,页面滑动流畅是60fps,也就是说1秒有60帧要更新,即每隔16.7ms要产生一帧画面,而如果CPU和GPU一起处理的时间超过了这个时间,就会造成掉帧和卡顿
五、滑动优化
- CPU
1、在子线程中创建对象
2、预排版:布局计算、文本计算、缓存高度
3、预渲染:异步绘制,异步图片解码 - GPU
1、纹理渲染,视图混合 - 性能思考:遇到性能问题,可以从下面的入手
1、是否受到CPU和GPU的限制
2、是否有不必要的CPU渲染
3、是否有太多的离屏渲染
4、是否有太多的图层混合操作
5、是否奇怪的图片格式和尺寸
6、是否涉及到昂贵的View和效果
7、view的结构是否合理
六、UI绘制原理
- 异步绘制:代理负责生成bitmap,然后赋值到layer.contents属性中
[self.layer.delegate displayLayer]
七、离屏渲染
-
On-Screen Rendering:当前屏幕渲染,指的是GPU的操作是在当前屏幕渲染缓冲区中进行
-
Off-Screen Rendering:离屏渲染,分为CPU离屏渲染和GPU离屏渲染;离屏渲染,在当前缓冲区外新开辟一个缓冲区进行渲染,应当尽量避免GPU离屏渲染
-
避免离屏渲染:CPU需要做额外的渲染操作。通常CPU在做渲染的时候是很快的,但是涉及到Off-Screen渲染的时候情况会有所不同,因为需要额外开辟一个缓冲区进行渲染,然后绘制的过程中会在On-Screen和Off-Screen中来回切换上下文,这个过程比较消耗时间,并且会涉及到每一帧的显示,CPU和GPU处理的时间超过16.7ms,所以处理不当的时候出现掉帧和卡顿的问题
-
转载请标明出处
-
如有错误理解,还请各路大神批评指出