維塔士上海工作室技術(shù)總監(jiān):在Switch游戲移植過(guò)程中,我們做了哪些優(yōu)化?
12月7日至12月10日,由騰訊游戲?qū)W院舉辦的2020騰訊游戲開(kāi)發(fā)者大會(huì)(以下簡(jiǎn)稱(chēng) TGDC)于線(xiàn)上舉行。大會(huì)第三天,維塔士上海工作室技術(shù)總監(jiān)Andy Fong就Switch移植游戲如何進(jìn)行優(yōu)化的問(wèn)題,發(fā)表了“在高寒處保持溫暖”的演講。
?
?

演講中,Andy Fong談到了關(guān)于任天堂Switch平臺(tái)開(kāi)發(fā)的一些理念和重點(diǎn),他認(rèn)為Switch著重在于創(chuàng)新功能,首先將移動(dòng)平臺(tái)跟主機(jī)融合在一個(gè)游戲機(jī)里的,在手柄上加入新的HD震動(dòng)和紅外線(xiàn)檢查。
此外,Switch可以同一臺(tái)主機(jī)進(jìn)行多人游戲,也可多人聯(lián)機(jī)。同時(shí)他也強(qiáng)調(diào),Switch并沒(méi)有投入當(dāng)下最高性能的一些硬件,所以在移植PC或其他主機(jī)端游戲時(shí),內(nèi)存也要有所降低。
?
?

以《生化奇兵合集》為例,Andy Fong在大屏幕上展示了同一游戲場(chǎng)景下,Switch和Xbox平臺(tái)的效果圖。
Andy Fong表示:在保持畫(huà)質(zhì)及游戲性的前提下,希望把Switch游戲優(yōu)化至穩(wěn)定幀數(shù)。為達(dá)到這一目標(biāo),開(kāi)發(fā)者需要解決3個(gè)方面的問(wèn)題:內(nèi)存優(yōu)化、CPU優(yōu)化、CPU優(yōu)化。并對(duì)協(xié)作優(yōu)化的工具進(jìn)行選擇。
?
?

?
以下為演講實(shí)錄,由游戲日?qǐng)?bào)編輯整理
首先在內(nèi)存優(yōu)化中,我們通過(guò)屏幕統(tǒng)計(jì)工具、日志報(bào)告、專(zhuān)用內(nèi)存分析工具去收集實(shí)際上各個(gè)模塊使用到的內(nèi)存,再?gòu)氖褂脙?nèi)存較多的模塊開(kāi)始,制定相應(yīng)策略。
比如使用底層虛擬內(nèi)存分配接口配合虛擬內(nèi)存頁(yè)分配器,同時(shí)使用動(dòng)態(tài)的VRAM分配,以及為大塊VRAM單獨(dú)分配內(nèi)存池。此外,我們不太推薦使用環(huán)緩沖或雙緩沖。
?

因?yàn)槠渌脚_(tái)內(nèi)存足夠,存在一些冗余的資源。所以?xún)?nèi)容優(yōu)化的其中一項(xiàng)是要清除冗余的資源。
這里分為4個(gè)方面:清理不必要的立體聲音頻、渲染緩沖;及時(shí)去掉一些不必要的關(guān)卡加載來(lái)保持內(nèi)存平衡;UI貼圖和底層貼圖其他平臺(tái)可能選擇常駐在內(nèi)存里,而Switch移植優(yōu)化時(shí)則只會(huì)保留當(dāng)前需要用的貼圖。
當(dāng)冗余的數(shù)據(jù)清除后,一占用較大內(nèi)存的貼圖也需要優(yōu)化。這一部分我們選擇了ASTC壓縮,并限制了最高mipmap的分辨率,并對(duì)小貼圖進(jìn)行了合并。
?

動(dòng)畫(huà)數(shù)據(jù)也選擇了更激進(jìn)的壓縮方法。當(dāng)碰到一些很大的關(guān)卡時(shí),其中一個(gè)方式是選擇拆分成幾個(gè)小關(guān)卡。只有當(dāng)玩家處于特定關(guān)卡時(shí)對(duì)其單獨(dú)加載,這樣也能較大程度節(jié)省內(nèi)存。
當(dāng)優(yōu)化完內(nèi)存后,游戲基本可以運(yùn)行,但可能未達(dá)到30幀。接下來(lái)就是對(duì)CPU和GPU的優(yōu)化。
在CPU上,一方面我們會(huì)選擇采用一些引擎專(zhuān)用的工具,如UE4的Stat命令。也會(huì)用到如Frame PRO等第三方工具。如果有任天堂開(kāi)發(fā)者賬號(hào),也能使用到Switch平臺(tái)自己的CPU研究工具。
在過(guò)去的CPU優(yōu)化經(jīng)驗(yàn)上,我們會(huì)使用到一個(gè)多線(xiàn)程渲染。從單線(xiàn)程改變到多線(xiàn)程會(huì)怎么樣呢?根據(jù)以往研究Switch平臺(tái)的圖形接口,實(shí)際上是能接受多線(xiàn)程渲染的,但其中最大的難點(diǎn)在于拆分隊(duì)列。
?

由于拆分隊(duì)列的各項(xiàng)設(shè)置本身也會(huì)占用額外性能,所以在CPU優(yōu)化中嘗試采取了不同的渲染步驟去攻克這一難點(diǎn)。最后完成多線(xiàn)程渲染后,實(shí)際上在準(zhǔn)備命令緩沖的時(shí)間從20毫秒減少到了6毫秒,是一個(gè)很大的提升。
CPU優(yōu)化的另一方面則是圖形腳本的原生化。由于現(xiàn)在越來(lái)越多的引擎會(huì)使用一個(gè)圖形腳本去進(jìn)行游戲邏輯,包括UE4的藍(lán)圖,此類(lèi)腳本的重度使用很可能對(duì)主線(xiàn)程性能產(chǎn)生壓力,所以在Switch移植游戲中,我們是采用原生化的方法是把腳本轉(zhuǎn)換成C++代碼。如果是深度原生化提升可能會(huì)達(dá)到10%到20%。
CPU優(yōu)化的第三方面是對(duì)聲音的優(yōu)化,我們會(huì)先使用第三方聲音庫(kù)提供的工具來(lái)具體來(lái)進(jìn)行性能檢查。其中,經(jīng)常使用到的優(yōu)化手段有:使用OPUS和ADPCM格式。
ADPCM的優(yōu)點(diǎn)在于它有優(yōu)秀的壓縮率并且壓縮速度也比較快。但有一個(gè)問(wèn)題是它的聲道比較有限。
此外,還有一個(gè)問(wèn)題是關(guān)于DSP音效的播放,這些效果需要CPU去進(jìn)行一定的運(yùn)算,我們推薦把這些效果烘焙到一些聲道上,節(jié)省一些運(yùn)算的效率。而把一些低優(yōu)先值的聲音先去掉或把播放頻率降低,也可以節(jié)省一些運(yùn)算時(shí)間。對(duì)于距離遠(yuǎn)的一些3D聲音可以考慮把它放到虛部。
對(duì)于GUP的性能優(yōu)化,由于GPU一般會(huì)跟著色器的效率有關(guān),也會(huì)跟每個(gè)渲染命令填充的像素有一定關(guān)系。考慮到Switch的GPU性能,也為了保障2種模式都能達(dá)到30幀,所以主機(jī)分辨率采用的是1080P,掌機(jī)則是720P。
?

在GPU性能分析工具的選擇上,我們會(huì)采用SDK提供的一些API去獲取GPU不同步驟中的渲染時(shí)間。同時(shí),我們也會(huì)采用SDK提供的專(zhuān)門(mén)的工具,再通過(guò)這2種工具去分析GPU出現(xiàn)了什么問(wèn)題。
在GPU優(yōu)化上,我們首先會(huì)考慮對(duì)著色器進(jìn)行優(yōu)化,主要是去除分支。實(shí)際上分支語(yǔ)句無(wú)論是對(duì)于CPU還是GPU都是一些難點(diǎn),而我們的方法是改變陳旭流程控制的語(yǔ)句,以及替換分支語(yǔ)句寫(xiě)法。其次,我們需要對(duì)代碼進(jìn)行優(yōu)化,代碼優(yōu)化主要的解決方法我們采用的是對(duì)圖塊進(jìn)行緩沖。
例如,GPU可以把一些繪制的請(qǐng)求收集起來(lái),再把渲染緩沖劃分成多個(gè)圖塊,再依次播放。這個(gè)方法適用于當(dāng)游戲中存在大面積的粒子效果,而這些粒子都需要去訪(fǎng)問(wèn)幀緩沖。
?
當(dāng)上面所有的GPU手段都沒(méi)有取得太好效果時(shí),我們會(huì)選擇對(duì)美術(shù)資源進(jìn)行優(yōu)化。例如在《幽浮2》的很多小房間內(nèi),原本是高精度的細(xì)節(jié),但是在鏡頭拉遠(yuǎn)后,其實(shí)并不需要對(duì)所有房間都是高精度。于是我們對(duì)每個(gè)房間創(chuàng)建了相對(duì)精度較低的LOD模型,而實(shí)際在Switch上顯示區(qū)別并不大。
除了優(yōu)化策略,一些優(yōu)化工具對(duì)我們優(yōu)化也起到了很關(guān)鍵的作用,包括檢測(cè)掉幀的工具,觸發(fā)特定敵人和技巧的工具,第三方軟件Simplygon、houdini等制作低模LOD的工具,自動(dòng)測(cè)試工具。
?

總的來(lái)說(shuō),我們是希望能夠在保護(hù)原來(lái)游戲的畫(huà)質(zhì)和游戲性的情況下,Switch移植游戲依舊能達(dá)到一個(gè)穩(wěn)定的幀數(shù),能夠加強(qiáng)提高玩家的體驗(yàn)。
在最后的Q&A的環(huán)節(jié)上,Andy Fong對(duì)以下幾個(gè)問(wèn)題做出了回答:
Q1:從技術(shù)層面來(lái)說(shuō),跨平臺(tái)適配的難點(diǎn)在哪里?如何應(yīng)對(duì)?
Andy Fong:第一方面是底層系統(tǒng)的一些適配,包括內(nèi)存I/O輸入輸出、渲染器的適應(yīng)。我們需要參考原來(lái)它用到了哪些功能,然后在新平臺(tái)需要怎么去實(shí)現(xiàn)這些功。其實(shí)就是提早的去定義一個(gè)優(yōu)化的策略。我們需要越早去安排一些工作,對(duì)服務(wù)器端或者是客戶(hù)端進(jìn)行一些調(diào)整。
Q2:如何進(jìn)行圖形腳本原生化?
Andy Fong:其實(shí)原生化能帶來(lái)很高的一個(gè)性能優(yōu)化,但確實(shí)是有一些困難,首先是一個(gè)工具的適應(yīng)性。它并不能完全百分百的能夠?qū)λ械牟煌?lèi)型的腳本都能夠適應(yīng)。包括腳本,工具方面都需要一步步調(diào)整。還有一個(gè)轉(zhuǎn)化正確性的問(wèn)題,每做一個(gè)原生化都會(huì)需要去驗(yàn)證。