理解 VSync
iOS图像显示原理
关于CPU和GPU两个硬件都是通过总线连接起来的,CPU主要处理UI的布局和一些文本信息的计算以及整个绘制过程图片编解码,最后在合适的时机提交位图给GPU。而我们的GPU则是负责对位图进行渲染,最后将渲染好的位图放到帧缓冲区。随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。
纹理格式 是能被 GPU 所识别的像素格式,能被快速寻址并采样。
之后 GPU 就要做他最牛逼也是最擅长的事了 – GPU 会将众多的纹理进行合成,其中就利用到了从 CPU 处传来的透明值等纹理显示的信息
卡顿原因
在 VSync 信号
到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于 垂直同步
的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。
三重缓存原理(这里并不代表iOS实际缓存原理)
- VSync 信号负责调度从 Back Buffer 到 Frame Buffer 的复制操作
- Back Buffer:后备缓冲区
- Frame Buffer:帧缓冲区
- VSync的引入是解决tearing问题
- 二级缓存:在这种模型下,只有当 VSync 信号产生时,CPU/GPU 才会开始绘制。这样,当帧率大于刷新频率时,帧率就会被迫跟刷新频率保持同步,从而避免“tearing”现象。
- 三级缓存是解决jank
下图为三级缓存,比二级多了一个back buffer