當前位置:
首頁 > 科技 > VR遊戲《Space Pirate Trainer》如何用英特爾620集顯實現流暢運行

VR遊戲《Space Pirate Trainer》如何用英特爾620集顯實現流暢運行

文章相關引用及參考: intel

本文來自Seth S. (Intel)

映維網 2018年08月24日)《Space Pirate Trainer》是兼容HTC Vive,Oculus Touch和Windows Mixed Reality的VR遊戲之一。1.0版本最初於2017年10月發行,並迅速風靡VR社區,在全球VR街機店中佔據了一席之地。據統計,這款遊戲的銷量已經超過15萬份。這甚至成為了眾多VR硬體廠商用來演示VR神奇之處的首選內容之一。

《Space Pirate Trainer》的創意總監,遊戲開發商I-Illusions的首席執行官德克·范威爾登(Dirk Van Welden)曾說道:「我永遠都不會開發VR遊戲。」這是他首次使用Oculus Rift原型後發表的言論。作為Kickstarter的支持者,他拿到了這款設備,但並沒有留下深刻的印象,因為范威爾登經歷了相當嚴重的暈動症,並準備基本上放棄虛擬現實。

幸運的是,後來出現了位置追蹤,而他準備再給VR一次機會,體驗HTC Vive的原型。經過一個月的實驗後,他們完成了《Space Pirate Trainer》的首個原型。范威爾登將其發布到SteamVR論壇,希望可以獲得社區的反饋,而他在每個版本更新中發現了越來越多的受眾。這款遊戲同時引起了Valve的注意,後者邀請I-Illusions參加他們的SteamVR開發者演示,並向媒體介紹了《Space Pirate Trainer》。范威爾登知道自己已經做出了一定的成績,所以他接受了邀請。即使在預測試階段,遊戲都受到了玩家的歡迎。

1. 什麼是主流VR?

主流VR主要是指降低VR門檻,使得用戶無需過分投資硬體即可開玩一些最流行的VR遊戲。對於大多數高端VR體驗,圖形處理方面的最低規格要求是英偉達GeForce GTX 970或更高版本。除了購買昂貴的獨顯外,玩家同時需要為頭顯和感測器的組合支付數千人民幣。VR設置的成本可以迅速疊加。

但是,如果可以在搭載集顯的系統上運行VR遊戲呢?這意味著擁有Microsoft Surface Pro,Intel NUC或Ultrabook設備的所有移動用戶都可以開玩一些高端VR體驗。搭配不需要外部追蹤器的WMR頭顯,你將能夠隨時隨地設置VR。這聽起來好得令人難以置信,是吧?范威爾登和我也這麼認為,但我們發現,你可以通過最小的權衡協調來實現非常優秀的體驗。

圖1:左為《Space Pirate Trainer》的預測試版;右邊則是1.0版本

2. 在搭載集顯的13瓦特SoC上以60 fps渲染兩隻眼睛?你是說真的嗎?

如何令你的VR遊戲在集顯上運行呢?《Space Pirate Trainer》的初始埠運行速度為12 fps。主流空間所需的幀速率僅為60 fps,但這給我們留下了48 fps的空間,可以通過某種方式進行大幅度的優化。幸運的是,我們發現了一系列唾手可得的成果,亦即能夠極大地影響性能的要素。下面是一個並排比較:

圖2:左邊以12 fps運行《Space Pirate Trainer》;右邊的速度則是60 fps

3. 開始

VR開發者可能幾乎都沒有優化集成圖形的經驗,而這裡需要注意一些非常重要的事情。在桌面分析和優化中,熱量(熱量產生)通常不是問題。你可以單獨考慮CPU和GPU,並假設每個都能以完整的時鐘速率運行。遺憾的是,SoC並非如此。「集顯」意味著GPU與CPU集成在同一晶元上。每次電流通過電路都會產生一定的熱量,並朝所有元件輻射。由於這種情況發生在CPU端和GPU端,因此這可以為整個封裝帶來大量的熱量。為了確保晶元不會出現損壞,我們需要限制CPU或GPU的時鐘速率以允許間歇性散熱。

為了保持一致性,將搭載可預測熱量模式的測試系統作為基線非常有用。這樣你總是擁有一個可靠的參考點,可以在實驗時驗證性能優化或進行回歸分析。為此,我們建議使用GIGABYTE Ultra-Compact PC GB-BKi5HT2-7200作為基準,因為它的熱量非常一致。當在這台機器上以60 fps的速度運行遊戲時,你就可以針對各個原始設備製造商(OEM)的設備,看看它們的運行效果。每台筆記本電腦都提供自己的散熱解決方案,這有助於在熱門的設備上運行遊戲,並確保散熱解決方案能夠跟上。

圖3:GIGABYTE Ultra-Compact PC GB-BKi5HT2-7200

規格(產品可能因地區而有所不同):

採用最新的英特爾酷睿第7代處理器

超小型PC設計,僅0.6L(46.8×112.6×119.4mm)

支持2.5英寸HDD/SSD,7.0/9.5 mm厚(1×6 Gbps SATA 3)

1 x M.2 SSD(2280)插槽

2個SO-DIMM DDR4插槽(2133 MHz)

英特爾IEEE802.11ac,雙頻Wi-Fi和藍牙4.2 NGFF M.2卡

英特爾HD Graphics 620

1個Thunderbolt 3埠(USB 3.1 Type-C)

4個USB 3.0(2 x USB Type-C)

1個USB 2.0

HDMI 2.0

HDMI和Mini DisplayPort輸出(支持雙顯示屏)

Intel Gigabit Lan

雙陣列麥克風(支持語音喚醒和Cortana小娜)

耳機/麥克風插孔

上述系統主要是用於我們的所有優化,以實現一致的結果。出於本文的目的和提供的數據,我們將採用Microsoft Surface Pro:

圖4:Microsoft Surface Pro

規格:

對於本次優化,我們使用了英特爾圖形性能分析器(Graphics Performance Analyzers)。這是一套圖形分析工具,而我不會詳細介紹每個細節。但在大多數情況下,我們將使用圖形幀分析器(Graphics Frame Analyzer)。

4. 優化

為了達到60 fps,同時又不影響美學,我們進行了一系列的實驗。以下列表說明了就性能和最小化藝術變化而言,優化降壓的最大優勢。當然,每次遊戲都有所不同,但它們是你實驗的第一步。

4.1 著色器-地板

第一個優化可能是最容易和最有效的改變。場景的地板可以佔據相當一部分的像素覆蓋。

圖5:地板場景,地板進行了突出顯示

上圖在幀緩衝區中以洋紅色突出顯示了地板。就像素覆蓋範圍而言,地板佔據場景的60%以上。這意味著影響地板的材質優化會對保持低於幀預算產生巨大的影響。《Space Pirate Trainer》當時採用了包含反射探針的標準Unity著色器來獲取表面上的實時反射。反射是一項非常棒的功能,但在我們的目標系統上計算和採樣每一幀的成本都有點過於高昂。我們使用簡單的Lambert著色器來替換標準著色器。這不僅保存了反射採樣,而且避免了使用正向渲染系統時標記為「重要」的動態照明所需的額外通道。

圖6:優化前渲染地板的測量數據

圖7:在優化後渲染地板的測量數據

根據上面的性能比較,我們可以看到渲染地板的原始成本大約是每幀約1.5毫秒,而替換著色器的成本僅為每幀約0.3毫秒。 這在性能上提升了5倍。

圖8:著色器的程序集從267條指令(左)減少到只有47條(右),而且每個樣本的像素著色器調用次數明顯減少

如上圖所示,著色器的程序集從267條指令減少到只有47條,而且每個樣本的像素著色器調用次數明顯減少。

圖9:同一場景的並排比較。左側是標準著色器,右側是優化的Lambert著色器。

上圖是同一場景的並排比較圖,分別採用的是標準著色器和Lambert著色器。請注意,在經歷所有這些變化之後,我們仍然留下了一個漂亮,整體的地板。微軟同時創建了許多Unity內置著色器的優化版本,並將它們作為其混合現實工具包的一部分。你可以試用工具包中的材質,並看看它們是如何影響遊戲的畫面和性能。

4.2 著色器-無光照著色器(unlit shader)的材質批處理

繪製調用批處理是捆綁具有共同屬性的單獨繪製調用的慣例。渲染線程通常是性能瓶頸的焦點,尤其是對移動和VR而言,而批處理只是功能帶中緩解驅動程序瓶頸的主要工具之一。就Unity引擎而言,批量繪製調用所需的共同屬性是材質和材質所使用的紋理。Unity引擎能夠進行兩種批處理:靜態批處理和動態批處理。

靜態批處理非常簡單,通常使用起來很有意義。只要場景中的所有靜態對象在檢查器中都標記為靜態,與這些對象的網格渲染器組件相關聯的所有繪製調用都將進行批處理(假設它們共享相同的材質和紋理)。最好的做法是在引擎檢查器中標記所有保持靜態的對象,從而巧妙地優化不必要的工作,並將其從Unity引擎中的各種內部系統中刪除,這對於批處理而言尤為如此。請記住,對於WMR主流而言,實例化立體渲染尚未實現,因此任何已保存的繪製調用都將計為兩倍。

動態批處理有一點點細微差別。靜態批處理和動態批處理之間要求的唯一區別是,必須考慮動態對象的頂點屬性計數,並確保其低於某個閾值。請務必查看Unity文檔以了解Unity版本的閾值。通過在英特爾GPA圖形幀分析器中進行幀捕獲來驗證幕後實際發生的事情。請參閱下面的圖10和圖11,了解禁用和啟用批處理後《Space Pirate Trainer》幀之間的幀可視化差異。

圖10:禁用批處理和實例化;1300次繪製調用;總共150萬個頂點;GPU持續時間為3.5毫秒/幀

圖11:啟用批處理和實例化;8次繪製調用;總共200萬個頂點;GPU持續時間為1.7 ms /幀(性能提升2倍)

如上圖所示,渲染1300艘船(總共150萬個頂點)所需的繪製調用量從1300一直下降到8。在批量處理的示例中,我們實際上渲染了更多的船隻(總共200萬個頂點)。這不僅節省了渲染線程上的大量時間,並且通過更有效地運行圖形管道而在GPU上節省了相當多的時間。通過這樣做,我們實際上獲得了2倍的性能提升。為了最大化批量調用的總量,我們同時可以利用一種名為Texture Atlasing的技術。

Texture Atlas基本上大紋理和sprites的集成,用於將不同的對象打包至單一的大型紋理中。要利用這項技術,我們需要更新紋理坐標。這聽起來可能很複雜,但Unity引擎提供了實用程序,可以幫助我們輕鬆實現自動化。美術同樣可以利用他們選擇的建模工具,並以熟悉的方式來構建Atlas。回顧模型之間共享紋理的批處理要求,Texture Atlas可以成為一種強大的工具,幫助你在運行時避免不必要的工作,從而以低於16.6毫秒/幀的速度進行渲染。

關鍵要點:

確保所有在其生命周期內永不移動的對象都標記為靜態。

確保要進行批處理的動態對象的頂點屬性少於Unity文檔中指定的閾值。

確保創建Texture Atlas以包含儘可能多的可批量處理對象。

使用英特爾GPA圖形幀分析器來驗證實際行為。

4.3 著色器- 無人機鐳射槍的LOD系統

LOD(細節層次)系統是指基於某些參數動態交換各種asset類型。在本節中,我們將介紹根據camera距離更換各種材質的過程。對象越遠,在更低像素覆蓋範圍內實現最佳美學所需的資源就越少。更換asset應該對玩家保持隱晦。對於《Space Pirate Trainer》,范威爾登創建了一個系統,當無人機鐳射槍距離camera達到一定範圍時,就用更簡單的著色器來替換鐳射槍的Unity標準著色器的。請參閱以下示例代碼:

這是一個非常簡單的更新循環,它每隔100毫秒就檢測替換材質所需的對象距離,如果超過30個單位遠,則切換材質。請記住,替換材料可能會破壞批處理,因此總是建議首先進行實驗,並判斷優化將如何影響各種硬體級別上的幀時間。

除了這個手動材質LOD系統之外,Unity引擎同時在編輯器中內置了一個模型LOD系統。我們總是建議在較低瓦特的部分上為儘可能多的對象強制開啟最低LOD。對於高保真度可以產生重大影響的場景關鍵部分,可以為計算更加昂貴的材質和幾何體進行折衷。例如在《Space Pirate Trainer》中,范威爾登決定不遺餘力地渲染爆能槍,因為它們一直是場景中的焦點。這些權衡可以幫助遊戲保持所需的畫面,同時仍然最大化目標硬體並吸引潛在的VR玩家。

4.4 照明與後期效果-移除動態光源

如前所述,當引擎使用正向渲染通道時,實時照明會嚴重影響GPU的性能。這種性能影響的顯示方式是,受主要方向光源影響的模型的額外通道,以及所有光源都在檢查器中標記為重要。如果你的模型位於兩個重要動態點光源和主要方向照明的中間,你所看到的至少是這個對象的三個通道。

圖12:每當玩家在《Space Pirate Trainer》開槍時,翻倍武器底部點亮的動態光源,為地板提供5 ms的幀時間(突出顯示)

在《Space Pirate Trainer》中,槍管的點光源在較低的設置下被禁用,從而避免這些額外的通道,這可以節省相當多的幀時間。你可以回顧關於地板渲染的部分,並想像整個地板被渲染三次的情況。現在考慮為每隻眼睛做這件事情。你將得到6個幾何圖形的調用,覆蓋屏幕上大約60%的像素。

關鍵要點:

確保所有動態光源都被移除/標記為不重要。

烘烤儘可能多的光線。

為動態照明使用光線探針。

4.5 後期處理效果

如果不小心,後期處理效果可能會大幅削減你的幀預算。《Space Pirate Trainer》優化的「High」設置利用了Unity的後期處理堆棧,但在我們的表面目標上仍然只花費了大約2.6 ms/幀。見下圖:

圖13:「High」設置顯示了14個通道(從更多中減少);GPU持續時間為2.6 ms/幀

上面突出顯示的部分說明了《Space Pirate Trainer》後期處理效果中涉及的所有繪製調用,顯示的彈出窗口是所選調用的總GPU持續時間,大約2.6 ms。在一開始,范威爾登和團隊嘗試用mobile bloom來取代常用的效果,但發現它引起了分散人注意力的閃爍。最終,他們決定廢棄bloom,並將剩餘的樣式化效果合併到一個自定義通道中,使用color lookup table來近似計算高端版本的畫面。

合併通道將幀時間從先前的2.6毫秒/幀降低至0.6毫秒/幀(4倍的性能改進)。這種優化涉及更多,可能需要一位優秀的技術美術,但這是一個非常好的技巧。另外,即使Bloom的移動版本不適用於《Space Pirate Trainer》,測試移動VFX解決方案也是一項優秀,快速且簡單的實驗。對於某些場景設置,它們可能奏效並且性能更高。使用新的後期處理效果通道,檢查表示「Low」設置場景的幀捕獲:

圖14:「Low」設置,將所有後期處理效果合併為一個通道;GPU持續時間為0.6 ms/幀

4.6 HDR使用和垂直翻轉

避免在「Low」Tier使用高動態範圍(HDR)紋理,這可以以多種方式使性能受益,主要是因為HDR紋理和它們所需的技術(例如色調映射和bloom)在計算成本上相對昂貴。還有額外的顏色確定計算,以及每像素需要更多內存來表示全色範圍。最重要的是,在Unity中使用HDR紋理會令場景呈現倒置情況。通常情況下這都不是一個問題,因為最終的渲染目標翻轉只需大約0.3毫秒/幀,但當你的預算下降到16.6毫秒/幀時,你需要為每隻眼睛進行一次翻轉(約0.6毫秒/幀),這將佔據幀的相當大一部分。

圖15:單隻眼睛的垂直翻轉,291ms

關鍵要點:

取消選中場景camera上的HDR框。

如必須使用後期製作效果,請使用Unity引擎的Post-Processing Stack,而非有可能造成沉余工作的Image Effects。

移除任何需要深度通道的效果(如霧等)。

4.7 後期處理-抗鋸齒

多重採樣抗鋸齒(MSAA)的計算成本高昂。對於低設置,切換到時間穩定的後期製作效果抗鋸齒解決方案將相當明智。為了解MSAA在低端目標上的計算成本有多昂貴,我們下面來看看在高設置下捕獲的《Space Pirate Trainer》:

圖16:使用多重採樣抗鋸齒(MSAA)時的ResolveSubresource成本

ResolveSubresource API調用是MSAA的固定函數方式,它確定啟用MSAA時的渲染目標最終像素。我們可以在上面看到,單單這個步驟就需要約1毫秒/幀。

目前存在幾種成本更低的後期製作效果抗鋸齒解決方案,包括英特爾開發的Temporally Stable Conservative Morphological Anti-Aliasing (TSCMAA)。TSCMAA是可在英特爾集顯上運行最快的抗鋸齒解決方案之一。如果在升級到原生頭顯解析度之前以低於1280×1280的解析度進行渲染,則後期製作效果抗鋸齒解決方案對於避免鋸齒和保持良好體驗方面將變得非常重要。

圖17:TSCMAA與4倍多重採樣抗鋸齒的對比,前者提供了高達1.5倍的性能提升,有著更高質量的輸出。請留意模型邊緣的鋸齒效果

4.8 鐳射槍的光線投射CPU端優化

一般來說,光線投射操作在計算上並不是非常昂貴,但當《Space Pirate Trainer》出現太多的運動時,它們很快就會成為一種資源黑洞。大多數VR遊戲的瓶頸都在於GPU,但為什麼我們卻在擔心CPU性能呢?答案是熱量限制。這意味著SoC的任何工作都會在整個系統封裝中產生熱量。因此,即使CPU在技術上不是瓶頸,CPU工作所產生的熱量都能為封裝帶來足夠的熱量,從而限制GPU頻率,甚至是CPU本身的頻率。

熱量的產生為優化過程增加了一層複雜性。移動開發者對這個概念已經非常熟悉。為集成GPU的CPU尋找完美優化方法分散了人們的注意力,但實際上不一定需要是這樣。只需將整體優化視為主要目標即可。下面我們回到光線投射優化本身。

對於這種優化,其想法是光線投射檢查頻率可以根據距離而產生波動。光線投射越遠,檢查之間可以跳過的幀就越多。在范威爾登的測試中,他發現在最壞的情況下,實際的光線投射檢查和遠處對象的響應僅變化幾幀,這在VR渲染所需的幀速率下幾乎檢測不到。

5. 以較低解析度渲染,然後放大

大多數WMR頭顯的單眼原始解析度為1.4K或更高。根據一系列不同的因素,以這個解析度渲染到目標的計算成本可能非常昂貴。要定位低瓦特集成圖形組件,把渲染目標設置為合理更低的解析度將非常有用,然後讓全息API自動調整以適應最終的原始解析度。這將大大縮短你的幀時間,同時仍然能實現看起來不錯的畫面。例如,《Space Pirate Trainer》渲染至目標的單眼解析度是1024×1024,然後進行放大。

圖18:渲染目標解析度指定為1024×1024,然後放大至1280×1280

降低解析度時需要考慮幾個因素。顯然,不同的遊戲都有所不同,降低解析度會以不同的方式影響不同的場景。例如,包含大量精細文本的遊戲可能無法達到如此低的解析度,或者必須使用不同的技巧來保持文本保真度。有時可以通過將UI文本渲染為全尺寸渲染目標,然後在較低解析度渲染目標頂部進行點陣圖複製。在渲染場景幾何體時,這項技術可以節省大量計算時間,同時不會令整體體驗質量受損。

要考慮的另一個因素是鋸齒。渲染目標的解析度越低,出現鋸齒的可能性就越大。如前所述,可以使用後期製作效果抗鋸齒技術來進行一定的止損。在考慮抗鋸齒的成本之後,以較低解析度渲染場景的像素調用節省通常為凈正值。

5.1 首先渲染VR雙手和其他排序注意事項

大多數VR體驗都會渲染某種形式的雙手表示玩家的實際雙手位置。對於《Space Pirate Trainer》,替換的不僅只是雙手,同時還有爆能槍。不難想像這些物品將覆蓋兩個眼睛渲染目標的大量像素。圖形硬體支持一種名為Early-Z Rejection的優化技術,其允許硬體將正在渲染的像素深度與來自最後渲染像素的現有深度值進行比較。如果當前像素比最後一個像素更遠,則不需要寫入像素,並且保存該像素著色器的調用成本和圖形管道的所有後續階段。圖形渲染的工作方式反向畫家演算法(reverse painter』s algorithm)類似。畫家通常是從後到前進行繪畫,而同時由於這種優化,從前到後在遊戲中渲染場景將能帶來巨大的性能效益。

圖19:在幀開頭繪製《Space Pirate Trainer》中的爆能槍可以為所有像素保存像素調用

很難想像這樣一個場景:VR雙手,以及其握住的道具不會是最接近camera的網格。因此,我們可以先繪製雙手。在Unity中這很容易做到這一點。你只需找到與手形網格相關的材質,以及可以拾取的道具,並覆蓋它們的RenderQueue屬性即可。通過使用UnityEngine.Rendering命名空間中提供的RenderQueue枚舉,我們可以保證它們將在所有不透明對象之前得到渲染。相關示例請參見下圖:

UnityEngine.Rendering命名空間中的RenderQueue枚舉

覆蓋材質RenderQueue參數的示例代碼

如果需要,可以進一步覆蓋材質的RenderQueue順序,因為在任何給定時刻都存在對場景項目的邏輯分組。場景可以並按此進行分類與排序:

繪製VR雙手和任何可交互的物品(如武器等)。

繪製場景填料。

繪製舞台大件布景(建築物等)。

繪製地板。

繪製天空盒(如果是使用內置的Unity天空盒,這個步驟通常已經完成)。

圖20.在覆蓋RenderQueue順序時,對場景進行分類可能會有所幫助

Unity引擎的排序系統通常能很好地處理這個問題,但有時你會發現不符合規則的對象。與往常一樣,首先在GPA中檢查場景的幀,從而確保在應用這些方法之前正確地排序所有內容。

5.2 天空盒壓縮

最後一點是簡單的修復,其存在一些潛在的優勢。如果場景中使用的天空盒紋理尚未壓縮,你將可以發現巨大的增益。根據遊戲的類型,天空可以覆蓋每幀中的大量像素。儘可能降低採樣的強度,因為像素著色器可以對幀速率產生相當的影響。另外,當遊戲檢測到它在主流系統上運行時,降低天空盒紋理的解析度同樣有所幫助。請比較《Space Pirate Trainer》的性能:

圖21:只需簡單地將天空盒解析度從4K降低到2K,你可以實現5倍的性能提升。通過壓縮紋理可以帶來額外的提升

6. 總結

最後,我們在13瓦集成顯卡組件的「Low」設置上以60 fps運行《Space Pirate Trainer》。隨後,范威爾登將一系列的優化反饋到更高端平台的原始版本中,這樣每個人都可以從中受益。

圖22:最終結果:從12 fps一直到60 fps

之前以12 fps運行的「High」設置現在在集成圖形系統上以35 fps運行。降低VR進入13瓦筆記本電腦的障礙可以將你的遊戲帶給更多的玩家,並幫助提高遊戲的銷售量。

文章《VR遊戲《Space Pirate Trainer》如何用英特爾620集顯實現流暢運行》首發於 映維網。


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

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


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

英國教育大臣呼籲學校採用VR技術啟發學生,減輕教師工作量
AT&T與Magic Leap合作,獨家發售Magic Leap One

TAG:映維VR |