游戲為何總是卡?人眼成像背后的秘密
泡泡網顯卡頻道10月30日 公元1000年間漢人發明的走馬燈也許是世界上最早應用到視覺暫留原理的東西了。燈內點上蠟燭,燭產生的熱力造成氣流,令輪軸轉動,輪軸上有剪紙,燭光將剪紙的影投射在屏上,圖象便不斷走動。因為大多在燈各個面上繪制古代武將騎馬的圖畫,而燈轉動時看起來好像幾個人你追我趕一樣,故名走馬燈。后來法國人保羅·羅蓋在1828年發明了留影盤,它是一個被繩子在兩面穿過的圓盤。盤的一個面畫了一只鳥,另一面畫了一個空籠子,當圓盤旋轉時,鳥在籠子里出現了。
究其原理,物體在快速運動時, 當人眼所看到的影像消失后,人眼仍能繼續保留其影像0.1-0.4秒左右的圖像,這種現象被稱為視覺暫留現象,是人眼具有的一種性質。人眼觀看物體時,成像于視網膜上,并由視神經輸入人腦,感覺到物體的像。但當物體移去時,視神經對物體的印象不會立即消失,而要延續0.1 -0.4秒的時間,人眼的這種性質被稱為“眼睛的視覺暫留”。
當年的宋朝人顯然沒有意識到視覺暫留的重大意義,時至今日,這種現象廣泛的應用在人們生活的方方面面,無論是之前的CRT顯示器,還是液晶或者等離子;無論是膠片,模擬信號還是藍光,數字圖像,無一例外用到了人眼的視覺暫留。
我們常說的“幀數”,就是在1秒鐘時間里傳輸的圖片的量,也可以理解為圖形處理器每秒鐘能夠刷新幾次,通常用fps(Frames Per Second)表示。每一幀都是靜止的圖象,快速連續地顯示幀便形成了運動的假象。
關于“人眼不能分辨超過每秒30幀的畫面
后來人們通過研究發現,高的幀率可以得到更流暢、更逼真的動畫,要生成平滑連貫的動畫效果,幀速率不能小于8;每秒鐘幀數 (fps) 愈多,所顯示的動作就會越流暢,但與此同時,文件體積會變得越大。一般來說人眼能繼續保留其影像1/24秒左右的圖像,所以一般電影的幀速率為24fps。而對于幀數忽快忽慢的游戲而言,平均30幀也算流暢了。
有些視頻甚至只有17幀
大家可能會問:既然對于人眼來說,游戲30幀就流暢啦,那干嘛還要到60幀,甚至是120幀?最近幾年越來越多的人有這樣的切身體驗:明明平均幀數超過30幀大感覺依然遠遠不夠,即使平均幀速率達到60FPS,依然不能杜絕卡頓的現象,這又是什么原因呢?
通過研究測試,我們發現這是因為游戲畫面的幀數并不像電影那樣間隔時間相等,而是忽快忽慢,所以肉眼觀察出30幀以上的游戲,依然有卡頓現象完全可能!就這個話題,本文帶大家一起探索游戲卡頓的秘密,揪出導致畫面延遲的元兇!
之前的游戲性能測試,均是利用軟件或者游戲自帶的Benchmark程序,測試出一段場景內的最大最小平均幀數。一般來說這種測試方法可以反映顯卡的真實性能,但并不完美。為了研究清楚上面提到的現象,我們引入了最近關注度比較高的另一種測試方法,來讓顯卡的測試更加科學——每幀生成時間測試。
測試方法就是使用我們的老朋友Fraps fps軟件,在上面并不常用的Frametimes選項前面打勾。
這樣測試完畢的結果是我們有了下面的數據:

黃色和灰色數據是Fraps軟件自動生成的數據,綠色部分是我們通過一個簡單的函數算出來的每幀生成時間。
我們選擇了最新的高端的硬件配置,測試平臺使用了Intel Core i7 3770K,8GB DDR3 1600內存和HD7850 毒蜥版 2048M D5。

● 測試平臺顯卡:鐳風HD7750毒晰版
鐳風HD7750毒晰版采用了HD 7750顯示核心,GCN架構,晶體管數15億,性能較上代產品有著顯著的提升,在顯卡功耗和發熱方面也控制的恰到好處。顯卡支持DirectX 11.1、PCI Express 3.0和PCI-E 3.0。
● 測試平臺主板:技嘉G1.Sniper M3
技嘉 G1.Sniper M3是一款采用m-ATX板型設計的高端Z77主板,它結合了屢獲殊榮的G1.Killer設計理念,目標是給玩家提供強大的性能。無論是內建Creative專業級音效處理器、Sound Core3D高質感音效輸出還是支持 cFosSpeed 與網絡加速技術的芯片,都是為了讓玩家能有最棒的娛樂和聯網游戲體驗。
● 測試平臺電源:Antec HCP1200
安鈦克Antec HCP1200電源在世界超頻大賽中非常常見,通過了80PLUS認證,轉換效率高達92.4%,支持4路12V輸出,最高電流72A,支持四卡SLI/交火。平均無故障運行時間為10萬小時。配備一顆8cm靜音風扇,運行噪音極低。
● 測試平臺SSD:OCZ Vetrx3 240GB
OCZ的Vertex系列屬于它的高端固態硬盤,專門為高端玩家和存儲發燒友設計。隨著Sandforce控制器大紅大紫,OCZ也將Vertex系列升級到了全新的SF1200方案。如今SATA3.0 6Gbps接口大行其道,OCZ推出了基于SF2200系列主控芯片的Vertex 3固態硬盤,涵蓋60-480GB容量范圍。
下面正式踏上我們的探索之路。
我打算選擇一款要求比較低的DX10游戲FarCry2來測試,這款游戲自帶Benckmark,而且各種游戲特效選項一應俱全。測試設置如上圖所示,DX9模式下,所有特效全部開到最高,包括8XAA。

第一次測試成績圖

第二次測試成績圖
整個測試過程生成了數千幀,本次測試我們考察了前一千幀數據,這個數據量已經足以說明問題。而兩次測試相似的曲線也說明了亮點:
一、出現較大延遲并非偶然。
二、測試誤差在可以接受的范圍。
可以看出基本上每幀的生成時間都在10-15ms,但是極個別幀數沖到了20多毫秒甚至35毫秒秒以上!同樣如果是大多數幀數在30-40ms,那有可能個別幀數會沖到100ms以上,如果在游戲中感覺到了卡頓,那么這些幀無疑就是罪魁禍首!
看到這里,前面的設想可以說得到了初步的驗證。游戲卡頓現象終于揭開了面紗的一角。
現在我們離真相已經很近了,電影雖然只有24幀每秒,但由于每兩幀之間的間隔均為1/24秒,所以人眼不不會感覺到明顯的卡頓,游戲即使達到30幀每秒,但如果這一秒鐘內,30幀不是平均分配,就算是每秒60幀,其中59幀都非常流暢,而有一幀延時超過1/24秒,依然會讓我們感覺到明顯的卡頓。請注意,這種情況下,最低幀數依然是60FPS!
那那些因素會造成個別幀渲染時間超長呢?
想要論證這個現象,首先有必要提一下游戲畫面渲染的原理。和電影的順序播放不同,游戲的幀數完全是實時渲染而成的。每一幀從生成到渲染完畢,過程非常復雜。
簡單來說,先要生成三維圖像模型(幾何模型),將它們保存在自身的建模空間,然后通過模型變換將單獨的幾何模型移動到世界坐標系中,然后通過被稱為“相機變換”的過程,將幾何模型的世界坐標系轉換為攝像機坐標。相機坐標的參數包括投影方式、近平面、遠平面、視野和屏幕的長寬比例,它們決定了物體從相機坐標系投影變換到屏幕坐標系的位置。
這些參數實際上定義了一個視域四棱錐,也叫做視錐體。然后通過裁剪優化算法,通過投影到平面生成最初的二維畫面。接著通過消隱、光照計算、紋理映射、顏色融合等光柵化操作來算出相對正確的像素顏色,呈現出凹凸感、陰影、景深等效果,生成最后的游戲畫面。一幀畫面的誕生,至少包含了上述所有步驟,而其中每一步出現問題和延遲,都會對最終成像速度造成影響。
了解了這些,我們可以大膽猜測一下,可能是其中某些環節的不正常遲滯造成了個別幀渲染時間過長,最后導致畫面卡頓,于是我們做了下面幾組測試以求獲知真相。
MODE 1畫面參數設置
首先筆者懷疑是某些特效拖了后腿,火焰效果,物理加速和真實樹這幾個特效嫌疑很大,試想爆炸瞬間,如果火焰效果占用資源,或者物理加速和CPU的溝通延時這些都有可能是導致個別幀效率低下的罪魁禍首。

關閉了這幾個特效,依然有幾幀出現了夸張的延時,看來他們并不是關鍵癥結所在,而罪魁禍首另有其人……
MODE 2畫面參數設置
眾所周知,動態陰影的實時渲染是一項非常考驗顯卡的特效,問題會不會出在它身上呢?我們降低特效,采用MODE 2設置來測試,以期有所發現。

MODE 3畫面參數設置

依然出現了不正常的延時幀,看來最有嫌疑的幾種特效都證明是無辜的,或者說至少不是主犯,莫非一開始就想錯了方向?但不管怎樣,這次的測試應該有所收獲了,因為有一種推演理論叫做排除法。也就是說我們犯的錯誤越多,離真相大白也就越近了……

將特效分別調至高和低,出現了更多的異常幀。這說明了什么呢?說明我們依然沒有找到延遲的問題所在,但我們離真相已經不遠了,因為按照排除法,剩下的特效已經不多了。

我們將畫質和AA都調至最低,僅僅保留所謂的DX10效果,這時候異常幀已經變得非常罕見,看來AA是讓幀時間變長的重要原因,但它依然沒有完全杜絕,那最后我們只剩下一線希望了,如果這一次依然無果,我們前面所有的努力都將變得毫無意義。

測試的最后,我們獲得一份滿意的答案,在開啟DX9模式,不開啟AA的情況下,我們終于獲得了這樣的一組光滑完美的曲線!
這意味著我們終于找出了讓游戲卡頓的罪魁禍首——AA和DX10。這兩種特效師造成目前游戲出現不正常延時幀的最大原因。
找到兇手并不是本文的終結,因為結案不光需要人臟俱獲,而且要理清犯罪動機。正向推演出結論,下面我們逆過來解釋一下為什么AA和DX10會讓個別幀產生如此夸張的延遲,而導致游戲畫面的卡頓。
● 罪魁禍首之一:抗鋸齒(Anti-aliasing)
抗鋸齒(Anti-aliasing):標準翻譯為”抗圖像折疊失真“。由于在3D圖像中,受分辨的制約,物體邊緣總會或多或少的呈現三角形的鋸齒,而抗鋸齒就是指對圖像邊緣進行柔化處理,使圖像邊緣看起來更平滑,更接近實物的物體。它是提高畫質以使之柔和的一種方法。
如今最新的全屏抗鋸齒(FullSceneAnti-Aliasing)可以有效的消除多邊形結合處(特別是較小的多邊形間組合中)的錯位現象,降低了圖像的失真度。全景抗鋸齒在進行處理時,須對圖像附近的像素進行2-4次采樣,以達到不同級別的抗鋸齒效果。簡單的說也就是將圖像邊緣及其兩側的像素顏色進行混合,然后用新生成的具有混合特性的點來替換原來位置上的點以達到柔化物體外形、消除鋸齒的效果。
通過以往的測試,編輯認為抗鋸齒對顯存的容量和帶寬、延遲都提出了很高的要求,雖然FarCry2這款游戲對顯卡核心要求不高,但抗鋸齒倍數過高造成頻繁的像素采樣,依然有可能堵塞存儲堆棧,造成個別畫面延遲異常。
● 罪魁禍首之二:DirectX 10
DirectX 10最大的革新就是統一渲染架構(Unified Shader Architecture)。DX9之前的各類圖形硬件和API均采用分離渲染架構,即頂點渲染和像素渲染各自獨立進行,前者的任務是構建出含三維坐標信息的多邊形頂點,后者則是將這些頂點從三維轉換為二維,這樣便可以通過視覺欺騙在屏幕上顯示出“三維”的場景。
微軟在DirectX 10中提出了統一渲染架構的思想:在相同物理類型的渲染單元上執行不同類型的渲染程序。換句話說,只用一種渲染單元,讓它既能完成頂點渲染,也能完成像素渲染,甚至還能實現幾何渲染。這樣一來,渲染單元可以得到最大程度的利用,減少了資源閑置的情形。但是,相對頂點渲染來說,像素渲染將面臨大規模使用紋理所帶來的材質延遲,這是統一渲染架構不得不面對的現實。
文章的最后,我們從理論上找到了問題的所在:不顧一切追求高AA和DX10特效,但目前顯卡的架構并不能完全保證這些特效的流暢輸出。我想這也是為何最為流行的FPS游戲依然采用DX9C,而職業競技選手也不喜歡高畫質、高AA的原因。限于篇幅的限制,我們很難在此進一步探索不同硬件對超時幀產生的影響,本文的測試和討論也只是揭開了渲染效率和畫面質量之間矛盾的冰山一角。■<
關注我們


