要理解垂直同步技术,首先要理解两个概念:「逐行扫描」和「缓冲」。「逐行扫描」就是说,显示器显示画面并不是“蹭”一下就打出一张画面来,而是从上到下一行一行显示出来的,只不过是显示得比较快所以肉眼看不出来而已。
「缓冲」则是指显卡渲染好一张画面之后,就会把这张画面储存在显存中,然后去渲染下一张画面。如果显卡每秒钟可以产生 120 张画面会发生什么呢?结果就是每 1/120 秒就会有一张画面进入缓冲中,下一个 1/120 秒,下一张画面就会把上一张给取代掉。
目前还有很多显示器刷新率是 60Hz,也就是每秒钟要显示 60 张画面,也就是每 1/60 秒要显示一张画面。所以显示器会每隔 1/60 秒从显存中提取一次画面。
那么问题来了,如果显卡每秒产生 120 张画面,而显示器每秒只读取 60 张,这会出现什么问题呢?
显示器提取画面的时候会从上到下一行一行(逐行扫描)把画面显示出来,本来要 1/60 秒才能显示完,然而显示了一半(1/120 秒)下一张画面就塞进来了。这时候显示器并不会停止工作,而是囫囵吞枣地把上一张画面的一半与下一张画面都显示出来。
由于两张画面不一样,结果就是上面半截是第一张画面,下面半截是第二张画面,也就是所谓的画面撕裂。
画面撕裂
怎么解决呢?打开垂直同步。
垂直同步打开后,显卡的渲染速度强制锁定在最高每秒 60 张画面,这样显示器每次读取的时候都可以顺利读完。
然而打开垂直同步又会引发一个问题。如果一个跑步健将博尔牛寺第 0 秒在起跑线上,第1/60 秒就跑到了终点,那每秒渲染 60 张画面就完全看不到他中间的跑步过程!一开始就直接跑完。这就是所谓的「卡顿」,画面并不连贯。
于是你会发现不少游戏下面还有一个「双重缓冲」的开关,也就是多开设一个缓冲区。显卡依旧每秒渲染 120 张画面,第一张存在缓冲区1,第二张存在缓冲区2。显示器来读取画面的时候按顺序先从缓冲区 1 那里读完,再从缓冲区 2 那里读。这样就不会撕裂也不会卡顿了啊~
然而这又出现一个问题。本来博尔牛寺 1/60 秒就把比赛跑完了,显卡也把中间过程给渲染出来了,双重缓冲打开了之后,显示器从缓冲区 1 中读取第 0 秒的画面,再从缓冲区 2 中读取第 1/120 秒的画面,再又回到缓冲区 1 中读取第 1/60 秒一共三张