12月7日至12月10日,由騰訊遊戲學院舉辦的2020騰訊遊戲開發者大會(以下簡稱 TGDC)於線上舉行。大會第三天,維塔士上海工作室技術總監Andy Fong就Switch移植遊戲如何進行優化的問題,發表了「在高寒處保持溫暖」的演講。
演講中,Andy Fong談到了關於任天堂Switch平臺開發的一些理念和重點,他認為Switch著重在於創新功能,首先將移動平臺跟主機融合在一個遊戲機裡的,在手柄上加入新的HD震動和紅外線檢查。
此外,Switch可以同一臺主機進行多人遊戲,也可多人聯機。同時他也強調,Switch並沒有投入當下最高性能的一些硬體,所以在移植PC或其他主機端遊戲時,內存也要有所降低。
以《生化奇兵合集》為例,Andy Fong在大屏幕上展示了同一遊戲場景下,Switch和Xbox平臺的效果圖。
Andy Fong表示:在保持畫質及遊戲性的前提下,希望把Switch遊戲優化至穩定幀數。為達到這一目標,開發者需要解決3個方面的問題:內存優化、CPU優化、CPU優化。並對協作優化的工具進行選擇。
以下為演講實錄,由遊戲日報編輯整理
首先在內存優化中,我們通過屏幕統計工具、日誌報告、專用內存分析工具去收集實際上各個模塊使用到的內存,再從使用內存較多的模塊開始,制定相應策略。
比如使用底層虛擬內存分配接口配合虛擬內存頁分配器,同時使用動態的VRAM分配,以及為大塊VRAM單獨分配內存池。此外,我們不太推薦使用環緩衝或雙緩衝。
因為其他平臺內存足夠,存在一些冗餘的資源。所以內容優化的其中一項是要清除冗餘的資源。
這裡分為4個方面:清理不必要的立體聲音頻、渲染緩衝;及時去掉一些不必要的關卡加載來保持內存平衡;UI貼圖和底層貼圖其他平臺可能選擇常駐在內存裡,而Switch移植優化時則只會保留當前需要用的貼圖。
當冗餘的數據清除後,一佔用較大內存的貼圖也需要優化。這一部分我們選擇了ASTC壓縮,並限制了最高mipmap的解析度,並對小貼圖進行了合併。
動畫數據也選擇了更激進的壓縮方法。當碰到一些很大的關卡時,其中一個方式是選擇拆分成幾個小關卡。只有當玩家處於特定關卡時對其單獨加載,這樣也能較大程度節省內存。
當優化完內存後,遊戲基本可以運行,但可能未達到30幀。接下來就是對CPU和GPU的優化。
在CPU上,一方面我們會選擇採用一些引擎專用的工具,如UE4的Stat命令。也會用到如Frame PRO等第三方工具。如果有任天堂開發者帳號,也能使用到Switch平臺自己的CPU研究工具。
在過去的CPU優化經驗上,我們會使用到一個多線程渲染。從單線程改變到多線程會怎麼樣呢?根據以往研究Switch平臺的圖形接口,實際上是能接受多線程渲染的,但其中最大的難點在於拆分隊列。
由於拆分隊列的各項設置本身也會佔用額外性能,所以在CPU優化中嘗試採取了不同的渲染步驟去攻克這一難點。最後完成多線程渲染後,實際上在準備命令緩衝的時間從20毫秒減少到了6毫秒,是一個很大的提升。
CPU優化的另一方面則是圖形腳本的原生化。由於現在越來越多的引擎會使用一個圖形腳本去進行遊戲邏輯,包括UE4的藍圖,此類腳本的重度使用很可能對主線程性能產生壓力,所以在Switch移植遊戲中,我們是採用原生化的方法是把腳本轉換成C++代碼。如果是深度原生化提升可能會達到10%到20%。
CPU優化的第三方面是對聲音的優化,我們會先使用第三方聲音庫提供的工具來具體來進行性能檢查。其中,經常使用到的優化手段有:使用OPUS和ADPCM格式。
ADPCM的優點在於它有優秀的壓縮率並且壓縮速度也比較快。但有一個問題是它的聲道比較有限。
此外,還有一個問題是關於DSP音效的播放,這些效果需要CPU去進行一定的運算,我們推薦把這些效果烘焙到一些聲道上,節省一些運算的效率。而把一些低優先值的聲音先去掉或把播放頻率降低,也可以節省一些運算時間。對於距離遠的一些3D聲音可以考慮把它放到虛部。
對於GUP的性能優化,由於GPU一般會跟著色器的效率有關,也會跟每個渲染命令填充的像素有一定關係。考慮到Switch的GPU性能,也為了保障2種模式都能達到30幀,所以主機解析度採用的是1080P,掌機則是720P。
在GPU性能分析工具的選擇上,我們會採用SDK提供的一些API去獲取GPU不同步驟中的渲染時間。同時,我們也會採用SDK提供的專門的工具,再通過這2種工具去分析GPU出現了什麼問題。
在GPU優化上,我們首先會考慮對著色器進行優化,主要是去除分支。實際上分支語句無論是對於CPU還是GPU都是一些難點,而我們的方法是改變陳旭流程控制的語句,以及替換分支語句寫法。其次,我們需要對代碼進行優化,代碼優化主要的解決方法我們採用的是對圖塊進行緩衝。
例如,GPU可以把一些繪製的請求收集起來,再把渲染緩衝劃分成多個圖塊,再依次播放。這個方法適用於當遊戲中存在大面積的粒子效果,而這些粒子都需要去訪問幀緩衝。
當上面所有的GPU手段都沒有取得太好效果時,我們會選擇對美術資源進行優化。例如在《幽浮2》的很多小房間內,原本是高精度的細節,但是在鏡頭拉遠後,其實並不需要對所有房間都是高精度。於是我們對每個房間創建了相對精度較低的LOD模型,而實際在Switch上顯示區別並不大。
除了優化策略,一些優化工具對我們優化也起到了很關鍵的作用,包括檢測掉幀的工具,觸發特定敵人和技巧的工具,第三方軟體Simplygon、houdini等製作低模LOD的工具,自動測試工具。
總的來說,我們是希望能夠在保護原來遊戲的畫質和遊戲性的情況下,Switch移植遊戲依舊能達到一個穩定的幀數,能夠加強提高玩家的體驗。
在最後的Q&A的環節上,Andy Fong對以下幾個問題做出了回答:
Q1:從技術層面來說,跨平臺適配的難點在哪裡?如何應對?
Andy Fong:第一方面是底層系統的一些適配,包括內存I/O輸入輸出、渲染器的適應。我們需要參考原來它用到了哪些功能,然後在新平臺需要怎麼去實現這些功。其實就是提早的去定義一個優化的策略。我們需要越早去安排一些工作,對伺服器端或者是客戶端進行一些調整。
Q2:如何進行圖形腳本原生化?
Andy Fong:其實原生化能帶來很高的一個性能優化,但確實是有一些困難,首先是一個工具的適應性。它並不能完全百分百的能夠對所有的不同類型的腳本都能夠適應。包括腳本,工具方面都需要一步步調整。還有一個轉化正確性的問題,每做一個原生化都會需要去驗證。