1.视图事件传递和事件响应流程

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的层次结构是否合理?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。