在了解掉帧与撕裂之前我们需要了解一下CPU与GPU的分工
根据上图可以了解到,CPU主要是发出指令,指挥者角色,GPU相当于工人,工作着
CPU:适合比较复杂的计算工作
GPU:适合高并发并依赖性比较低的工作
一 .扫描显示系统总体来说分为两类:
1.随机扫描显示:(早期)
早期显示器,是通过一个电子光束,进行自由移动绘制出的图形
2.光栅扫描显示:
现代光栅扫描是从屏幕的左上角,一行一行的逐行进行扫描,绘制出图形。类似打印机。
二.高级光栅扫描显示系统结构
显示过程 :
现代显示系统,将处理模块单独出来,就是所谓的独立显卡。显示过程如上图,帧缓存区存储的是位图阵列,每个点存储的是颜色,通过视频控制器,进行每个点每个点的绘制到显示器上。
三.撕裂
显示过程中,可能出现一种情况,就是帧缓存区中存储了A数据,绘制到显示器上后帧缓存区又变成了新的B数据,拿到后显示到屏幕上,这种情况就出现如下图:
屏幕上的图片上半部分是上一帧的显示数据,而下半部分显示的后面的数据,这样就出现了撕裂
所以,后期苹果增加了 垂直同步Vsync + 双缓冲区 DoubleBuffering进行撕裂的解决,通俗来讲,就是在扫描中增加了一个锁,再扫描完一张图片后再显示下一帧的图片,这样就防止了撕裂,但是在CPU与GPU计算过程到渲染到屏幕上有一个等待时间,所以我们增加了双缓冲区,如下图:
在屏幕上显示Primary Surface的缓冲结果的时候,Back Buffer中会缓存下一帧的结果,等需要显示下一帧的时候则从Back Buffer中拿到缓冲结果,而同时Primary Surface会进行存储再下一帧的数据,这就形成双缓冲区的结果会依次显示到显示器上,这样就完全解决了撕裂
四.掉帧
启用垂直同步+双缓寸区后解决了撕裂问题,但是会出现如上情况:在显示A的时候,CPU与GPU还在处理B的数据,还没有结果给到缓存区,所以在显示下一帧的时候还会显示A,造成了 重复渲染同一帧数据,这个就叫掉帧。所以就又出现了三缓存区。
屏幕卡顿的原因:1.CPU/GPU渲染流水线耗时过长
2.垂直同步Vsync + 双缓存区 Double Buffering 以掉帧作为代价去解决屏幕撕裂
3.三缓存区:也不能完全解决掉帧,只能减少掉帧次数