[3].来聊一聊撕裂和掉帧以及卡顿
画面显示不全
在开始探讨上述问题之前,先来看下画面显示不全
(这张图只是为了比较形象的表示画面显示不全
)
在早期的图像技术中,CPU将图像处理成图像数据,并放到帧缓冲区中,然后由显示控制器去显示,但由于早期的CPU性能较差(或者比较差的CPU同时处理了太多的工作),CPU还未将一张完整的图片处理完毕,图像控制器便将数据拿走了,导致光栅扫描
时,前半部分有信号,而后半部分并没有图像信号,便造成了图片显示不全
。
双重缓存
技术
为了解决上述的问题,便在单缓冲区的基础上,再添加了一个相同的缓冲区,这样,在一个缓冲区接受由CPU处理的数据的时候,另一个缓冲区便将已经存储的数据交给显示控制器,显示控制器便会将这个数据显示出去,这样,当CPU与图像控制器协调一致的时候,就会显示出完整的图像了
在这之后,为了减轻CPU的压力,便将图像处理相关的模块完全独立出来,CPU仅负责核心数据的处理,独立出的这个模块便被用来专门处理图像相关,这个模块便是GPU
。
图像撕裂
只是为了形象的表示图像撕裂而夸张的图
游戏中的图像撕裂
GPU出现后,CPU由于不再处理图像相关的工作,压力大幅度减少,而GPU处理图片的专职工作,二者协调,在加载简单内容的时候,往往显得比较轻松。但加载比较复杂的内容时,新的问题便出现了,由于CPU与GPU并无法完全的协调一致,甚至CPU的性能会明显高于GPU,这时候,CPU将下一帧(C帧)的图像数据处理完毕,并移交给GPU,并向图像控制器发送显示信号,但GPU并未将当前帧(B帧)的图像处理(处理成数字信号)完毕,此时,显示器上正在显示上一帧(A帧)的图像,而图像控制器直接拿走了这一帧(B帧)的图像数据,并进行扫描显示,便出现了部分屏幕显示这一帧(B帧)其他部分显示上一帧(A帧)图像的情况,也就是图像撕裂
。
垂直同步
为了解决图像撕裂
的问题,就需要在GPU处理图像数据的时候,给正在处理的帧缓冲区加上一个锁,这个锁用于保证GPU在处理时,图像显示器无法拿走这个帧缓冲区的数据,并等待处理完成,之后再拿走数据并显示,简单来讲,就是给每个帧缓冲区增加了一个红绿灯,红灯等待,绿灯拿走,这个红绿灯便是垂直同步信号
,这项技术称为垂直同步
掉帧
引入垂直同步后,图像撕裂
的问题也算解决了,但这种拆东墙补西墙的方式并没有将显示变得更好,在很多N卡的优化教程里面,都是推荐关掉垂直同步
的,在处理简单的任务时还好,处理复杂的任务(尤其是游戏)的时候,便会引起掉帧
的问题。
CPU在渲染完下下一帧(D帧)的图像后,由于此时GPU并未处理完这一帧(B帧),而显示控制器收到信号,由于垂直同步的存在,显示完上一帧(A帧)后便一直在等待这一帧(B帧)完成,而此时CPU的下下一帧(D帧)的数据就会覆盖掉交换了帧缓冲区后存放着的下一帧(C帧)的数据,就丢失了C帧。
C帧丢失
所以在玩游戏(比如LOL)的时候,因为网络的不稳定,在某一个时刻,从服务器里面下载大量的图像数据,此时CPU处理得过来,但是GPU处理不过来的时候,就会产生
掉帧
的情况,而不开垂直同步
的时候人物就会'漂移'甚至出现多个人物。
综上所述,掉帧
的根本原因是CPU与GPU的工作不协调所致。
三重缓存
为了解决这个问题,部分厂商将二重缓存拓展为三重缓存,在多了一个帧缓存的情况下,掉帧
的情况有所缓解,但也只是稍微缓解,根本原因还是CPU和GPU的不协调所致。