當前位置:
首頁 > 最新 > 撕裂、延遲還有跳幀,還讓不讓好好玩遊戲?

撕裂、延遲還有跳幀,還讓不讓好好玩遊戲?

在上一期的《遊戲卡不卡,究竟用什麼來判斷?》文章中,我們講述了關於遊戲畫面流暢性的一些基礎概念,例如幀率、幀渲染時間以及等效幀率等。這部分數據基本上是由處理器和顯卡的計算性能所決定的。但這對兒「核心兄弟」計算渲染完成的畫面就是用戶最終看到的畫面么?顯然半路還有個「程咬金」——顯示器。

這哥們已經是第二次出境了,但不要在意這些細節

顯示器和顯卡之間的數據交換不同步,產生了很多人「耳熟但不能詳」的撕裂、延遲以及跳幀等一系列問題。這些現象相信不少人都在遊戲過程中體驗過,在戰況激烈,瞬息萬變的電競賽場上,這些微小的影響就可能被放大到左右戰局的地步。想要解決這些問題,就要首先知道這些問題產生的根本原因:顯卡渲染生成畫面的速率超過了顯示器本身的刷新率,以及顯卡渲染畫面所需時間的不均等性。

信號周期的不同步是所有畫面問題的主要根源

先讓我們站在一幀畫面的視角上,了解一下整個系統的運轉過程:當一幀畫面被GPU渲染完成後,首先會被發送到一個叫做「幀緩衝」(Frame Buffer,實際上就是在顯存中開闢的一塊專門的存儲空間,這裡面存儲的是屏幕上每一個像素點的R、G、B、Alpha通道等信息,可以想像成屏幕畫面在顯存空間的映射)中,在這裡等待顯示器將其取走。在幾個到十幾個毫秒後,顯示器的幀同步信號到達(正確的應該叫做場同步信號,這是從CRT時代的場同步信號代表一幀畫面掃描完畢繼承過來的),將這一幀畫面進行讀取,並最終繪製在屏幕上面。

GIF

同步信號到達(閃爍的上升沿青色指針),畫面被取走

這個看起來十分簡單的過程,運轉起來卻總是會不盡如人意:首當其衝的就是畫面閃爍問題。因為一個幀緩衝同時負責與GPU和顯示器雙方溝通,就難免出現當GPU向幀緩衝內寫入數據的時候,顯示器的幀同步信號到達並抓取畫面的情況,這種邊寫入邊讀取的狀態(再加上DRAM晶元的刷新機制)就造成了顯示的畫面會出現頻繁的閃爍。

既然是因為同時讀寫導致了閃爍的問題,那麼將幀緩衝分成兩個部分,分別負責讀/寫不就好了?「雙重幀緩衝」就這麼應運而生:兩個幀緩衝分別稱為「前端緩衝」和「後端緩衝」,GPU只負責向後端緩衝內寫入新的畫面幀數據,而顯示器的幀同步信號則只從前端緩衝中抓取畫面數據。但這個前後端緩衝區並不是絕對固定的,而是隨時互換。也就是當GPU向後端緩衝寫完一幀畫面數據的時候,這個緩衝區立即變成前端緩衝。而之前存放較老畫面幀的前端緩衝則立即變為後端緩衝,並等待GPU向其寫入更新的畫面後再次變成前端緩衝。

GIF

雙重幀緩衝的核心在於前後端緩衝的切換機制

這樣的更替機制能夠讓顯示器儘可能顯示最新渲染出來的畫面,同時解決了畫面閃爍的問題。但一個新的問題出現了:我們目前常見的顯示器,標準刷新率是60Hz(至於為什麼以60Hz為標準,這又是一個類似「馬屁股決定火箭直徑」的故事了),這意味著每隔16.7ms,顯示器會發送一次幀同步信號,但顯卡渲染畫面幀的速度並不是固定的,這種一個固定周期一個不等周期搭配起來,就可能出現當顯示器的幀同步信號到達前端緩衝,正在讀取畫面數據的時候,後面GPU已經向後端緩衝寫完新一幀畫面,前後緩衝調換的情況。此時後半部的畫面數據就變成了新一輪次前端緩衝中的畫面,最終顯示器上呈現出的就是一部分老畫面混合一部分新畫面的景象,這就是「撕裂」。

GIF

1/250倍速下可以看到嚴重且頻繁的畫面撕裂

舉個例子理解起來會更直觀一點:假設顯卡間隔渲染全紅色或全藍色畫面,某一個瞬間,GPU將渲染完的紅色畫面寫入後端緩衝。然後這個後端緩衝立即變為前端緩衝,開始等待顯示器的幀同步信號。於此同時,GPU開始向新的後端緩衝中寫入藍色的畫面。幾個毫秒(如果僅僅是紅藍畫面,那時間要短得多,這裡僅為了方便理解而放大了時間)後幀同步信號到達前端緩衝開始讀取紅色畫面的數據,當讀到一半的時候,後端緩衝中藍色的畫面已經寫入完畢變身前端緩衝,此時顯示器不得不接著從新的前端緩衝中讀取接下來的藍色畫面數據。當這一幀畫面全部讀取完畢顯示到屏幕上的時候,就變成了我們不想看到的一半紅色一半藍色的畫面。

GIF

因為撕裂效果而出現了不應該存在的畫面

在某些極端情況下,GPU的渲染速度太快,以至於在幀同步信號到達後的讀取過程中,前後端緩衝交換了多次,那最終屏幕上呈現的就會是多次撕裂的畫面。

解決畫面撕裂的辦法同樣很簡單:既然是因為GPU輸出畫面幀的速度太快導致前後端緩衝頻繁交換導致的,那隻要規定在顯示器的幀同步信號到達並讀取完畫面幀數據後,前後端緩衝才允許進行位置交換就可以了。因為畫面掃描都是以「行」方向進行的,因此撕裂都是垂直方向上的畫面被分割,所以消除撕裂的技術也就被稱為「垂直同步」

在遊戲畫面設置里,通常可以找到「垂直同步」選項

垂直同步雖然讓畫面撕裂消弭於無形,但受限於常規顯示器的刷新率只有60Hz,因此遊戲的幀率也就只有60FPS。強制降低幀率的結果不僅讓高性能顯卡的性能無從發揮,同時操作延遲的問題也被放大了。舉個例子:我們在遊戲中使用滑鼠轉動視角。滑鼠提供的定位信息決定了畫面變化的量。目前的遊戲引擎對操作輸入的處理周期大概是3~4幀。而垂直同步變相拖慢了GPU渲染畫面的時間(等待幀同步信號的過程中新渲染出來的畫面幀不能替換到前緩衝中去),使得連續的滑鼠移動操作不能生成連續的遊戲畫面視角轉動幀,操作就出現了延遲。在對抗激烈,畫面變化頻繁的競技類遊戲中,延遲對操作帶來的負面影響甚至遠大於畫面撕裂,這也是「垂直同步無用論」的誕生的根源。

垂直同步就是讓顯卡的輸出服從顯示器的同步信號

為了緩解垂直同步帶來的問題,「三重幀緩衝」應運而生。GPU輪番向兩個「後端緩衝」中寫入新的畫面幀,當一個後端緩衝寫完後,立即向「前端緩衝」同步數據,顯示器依舊只從前端緩衝中抓取畫面幀。如此一來,GPU就擺脫了幀同步信號的限制,能夠更快的根據用戶的操作向前渲染畫面幀,此時開啟垂直同步信號則只限定前後端緩衝的交換速率,雖然幀率上限仍然還是等同於顯示器的刷新率(因為Fraps之類的幀率顯示軟體實際上都是在監測前部緩衝區的更替速率),但操作延遲得到了有效地控制。

GIF

三重幀緩衝通過釋放顯卡性能來解決開啟垂直同步後延遲問題

三重幀緩衝帶來的缺點是顯存佔用的增加:標準的1920×1080 32bit色彩的畫面需要佔用約8MB的顯存空間,在三重幀緩衝狀態下顯存佔用就是24MB。如果再開個8xAA,那就變成了192MB。對於早期的顯卡來說,這樣的顯存佔用幾乎是災難性的。然而對於現在動輒8GB的顯存容量來說,即使是4K解析度在8xAA也不過才佔用768MB,完全不叫事兒(這只是幀緩衝的顯存佔用,遊戲過程中還有大量的材質、光影甚至是後處理數據來擠占顯存空間)。另外,三重幀緩衝並不是DirectX所支持的技術(DirectX中有個近似概念被叫做「預渲染隊列」,最多可以預渲染8幀畫面,有部分遊戲會使用3個預渲染隊列,並將其在設置中也稱為三重幀緩衝,但實際上預渲染的畫面是不允許丟棄的,會在其後的時間內依次更替到前端緩衝中被顯示出來,在GPU渲染速度高於顯示器刷新率的時候反而可能導致更嚴重的畫面延遲),因此儘管NVIDIA和AMD都在驅動里提供了對三重幀緩衝的支持,也還是要遊戲有針對性的優化才能正常發揮作用。

《反恐精英:全球攻勢》的設置中就可以看到開啟三重緩衝的選項

閃爍、撕裂和延遲都已經被解決或者得到緩解,那我們是不是能好好玩遊戲了呢?顯然還不能,因為還有「跳幀」沒有解決。

跳幀會讓我們看不到本應該存在的畫面幀

上圖中顯示器最終輸出的畫面里,顯示「4」和「8」的畫面被跳過了,這就是跳幀的原理。當GPU渲染畫面幀的時間比顯示器刷新間隔更短時,就存在某些畫面幀在上一個幀同步信號之後生成,但在下一個幀同步信號到來之前,就在幀緩衝中被新的畫面幀替換掉的情況。無論是雙重幀緩衝還是三重幀緩衝,都無法避免這個問題。而且顯卡的性能越好,被跳過的幀就越多。只是通常遊戲中被跳過的連續幀之間畫面的變化很小,很容易被「腦補」過濾掉(關於腦補畫面的機制,請參見上期文章《遊戲卡不卡,究竟用什麼來判斷?》),不易被我們感知到。但如果畫面變化非常劇烈,大腦的運算無法彌合其間的差異,跳幀就會被我們察覺到了。

GIF

在兩次幀同步信號

(青色箭頭指針閃爍)之間,前端緩衝里的畫面幀2(藍色)被刷新了,顯示器就跳過了這一幀畫面

綜上所述,即使CPU和GPU的計算性能足夠強,能夠輸出非常高的幀率,但畫面撕裂、操作延遲以及跳幀仍然會對我們的遊戲體驗產生嚴重的干擾(雙重幀緩衝已經得到非常普遍的應用,因此畫面閃爍的問題在當前遊戲體驗中已經極少見到),除了視覺觀感的劣化,延遲和跳幀更是會影響玩家對於遊戲中物體位移的判斷,在激烈且快節奏的主視角射擊遊戲中,這是非常致命的。那能不能更徹底的同時解決撕裂、延遲和跳幀問題呢?最簡單粗暴的辦法是加速顯示器的刷新周期:60Hz的顯示器一個刷新周期要16.7ms,120Hz就縮減到了8.3ms。高刷新率降低了撕裂出現的機率,並且在垂直同步開啟時能夠儘可能解放顯卡性能,降低了操作延遲。

高刷新率顯示器的價格門檻已經逐漸降低

雖然有一定效果,但暴力提升刷新率這種方案並沒有從根本上解決問題。更聰明的辦法是,既然所有問題都與顯示器的固定刷新周期有關,那讓這個刷新周期變成動態的就可以了,這就是「主動同步技術」——換個更簡單的說法:傳統的垂直同步技術是讓高速的顯卡聽命於低速的顯示器,而主動同步技術則是讓低速的顯示器聽命於高速的顯卡——NVIDIA的G-SYNC和AMD 的Free-Sync都是基於這個原理。

刷新率「動」起來,遊戲世界才更加精彩

NVIDIA通過在顯示器中增加額外的硬體模塊,使得GPU在向後端緩衝寫入一幀畫面,轉換為前端緩衝時,會立即向顯示器發送一個請求同步信號,顯示器收到該信號後立即開始抓取並繪製該畫面。如此一來,GPU渲染的每一幀畫面都能夠及時的被顯示出來,同時每一次屏幕刷新也都是一幀完整的畫面,撕裂和跳幀現象都不復存在。當然在G-SYNC模式下,每一幀的渲染時間無法短於顯示器繪製一屏畫面的時間(也就是最高幀率會鎖定到顯示器的刷新率上限,NVIDIA提供了自適應模式,該模式下幀率超過刷新率上限時會自動關閉G-SYNC功能)。不過隨著對更高刷新率面板的支持(目前已經有FHD下240Hz的產品),這個限制造成的影響已經微乎其微。

G-SYNC算是目前相對最為成熟的主動畫面同步技術

AMD則是通過DisplayPort介面的自適應刷新標準來實現動態刷新率的調節,無需額外的晶元,完全靠驅動本身實現。這樣在成本和開放性上都比G-SYNC更容易接受,但效果上要略遜一籌。

這台顯示器144Hz、G-SYNC HDR、4K、IPS、量子點、騷氣底座、敗家之眼LED都有了,還要什麼?

嗯,還要有錢,畢竟2W塊

所以,僅僅追求更好的處理器和顯卡,只是為遊戲體驗打下了一個良好的基礎,而想要得到「絕佳」的遊戲體驗,一款高刷新率(最好帶有主動同步技術)的顯示器,同樣至關重要

因為目前回復功能尚未開通,因此喜歡這種技術硬核類型文章的同學請點贊,我們會根據閱讀量和點贊數量來調整不同類型文章的比例,謝謝~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 G2Lab 的精彩文章:

華碩飛行堡壘FX80測試報告

TAG:G2Lab |