1.UIView和CALayer
- UIView提供内容、处理触摸等事件、参与响应链
- CALayer负责显示内容
2.事件传递
返回那个视图响应点击事件
func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { }
判断点击的点是否在当前视图范围内
func point(inside point: CGPoint, with event: UIEvent?) -> Bool {}
事件传递流程
3.图像显示原理
1.CPU:输出位图
2.GPU :图层渲染,纹理合成
3.把结果放到帧缓冲区(frame buffer)中
4.再由视频控制器根据vsync信号在指定时间之前去提取帧缓冲区的屏幕显示内容显示到屏幕上
4.UI卡顿的原因
一般来说,页面滑动流畅1s 60帧 = 16.7ms 1帧,如果CPU和GPU加起来的处理时间超过了16.7ms,就会造成掉帧甚至卡顿。
5.滑动优化方案
CPU:把以下操作放在子线程中
1.对象创建、调整、销毁
2.预排版(布局计算、文本计算、缓存高度等等)
3.预渲染(文本等异步绘制,图片解码等)
GPU:
纹理渲染,视图混合
一般遇到性能问题时,考虑以下问题:
是否受到CPU或者GPU的限制?
是否有不必要的CPU渲染?
是否有太多的离屏渲染操作?
是否有太多的图层混合操作?
是否有奇怪的图片格式或者尺寸?
是否涉及到昂贵的view或者效果?
view的层次结构是否合理?
网友评论