iOS 屏幕渲染和事件处理机制

屏幕显示原理

屏幕显示过程

CRT 电子枪一行一行进行扫描,为了与系统的视频控制器同步,会有 HSync 和 VSync 两个信号进行同步,前者是一行,后者是一帧的同步信号。

计算机系统中 CPU 计算好显示的内容,然后提交给 GPU, GPU 渲染完成后将结果放入帧缓冲区,随后视频控制器会按照 VSync 读取缓冲区数据,经过数模转换传递给显示器显示。

垂直同步(V-Sync)

简单的情况下,帧缓冲区只有一个,为了提高效率,显示系统通常引入两个缓冲区, iOS 就是两个缓冲区,安卓是三个。但是,双缓冲区吟哦日帧不同步问题,容易引起图片撕裂现象,也就是当某一个缓冲区的数据还没有完全通过视频控制器显示到屏幕的时候就被 GPU 刷新了,从而引起了上面的问题。而 V-Sync 就是为了解决这个问题引入的垂直同步信号,该信号通知之后 GPU 才会去进行新的一帧数据渲染和缓冲区更新。

卡顿, Why?

垂直同步信号

在 VSync 信号到来后,系统图像服务会通过 CADisplayLink 等机制通知 APP, APP 主线程开始在 CPU 中计算显示内容,然后将结算的结果传递给 GPU,GPU 进行处理之后将渲染结果提交给帧缓冲区,等到下次 VSync 来到之后显示到屏幕上。如上图 1 部分所示,但是如果在一个 VSync 中,如果 CPU 或者 GPU 没有完成内容提交,那么那一帧的数据就会被丢弃等到下一帧再去显示,如上图 2、3 部分两帧的时间实际上显示了一帧数据,这样在 3 帧之前实际上一直显示的是第 1 帧的内容,呈现的效果就是 – 卡顿。

上面显示了 GPU 没有在第二个 Sync 来之前提交完数据,所以对于 GPU 和 CPU 的压力进行评估和优化可以提高屏幕展示效果。

屏幕渲染:


  • On-Screen Rendering
  • Off-Screen Rendering

参考

  1. iOS 保持界面流畅的技巧 - Garan no Dou
-------------本文结束谢谢欣赏-------------
Alice wechat