當前位置: 華文問答 > 遊戲

為什麽遊戲【塞爾達:曠野之息】能在機能不咋的 NS 上平穩執行?

2022-05-18遊戲

看著下面回答。。。任天堂第一方雖然不追求極致畫面水平,但也不是淪落到和手遊比。。。

其實題主問題倒是不難理解,荒野之息本身技術上難點不小,一方面是開放世界,規模大,另一方面有晝夜變化,也有各種物理引擎活用帶來的高度動態化的場景,預烘焙啥的別指望了。無論對cpu和gpu來說的壓力都不小。但最後最佳化出來的結果還是非常不錯的,在掌機上能720p跑出來。

cpu瓶頸是相對好追的,tegra x1滿血狀態下單核可能比ps4/xbox one的美洲豹要強一些,不過ns那顆功耗上線不高,而且一共就三個核。但相比較而言,壓力反而不是那麽大。實際上把ns cpu頻率降低一半,荒野之息基本上也不存在比之前掉幀的情況,所以這方面任天堂拿捏的死死的,可能和wiiu cpu太爛有關。

gpu上考慮到荒野之息上的特性特別多,就會困難一些。一個是特性相容上,wiiu的latte gpu feature level是dx10 + 部份dx11特性,ns是dx12全相容(不包含dx12u),不過maxwell架構下async compute基本等於不存在,另一個就是效能上。

首先遊戲裏的視距非常非常遠,所有地形,神廟,高塔,神獸,龍等重要物體永遠不會被裁剪掉,你從地圖左下角可以直接看到地圖右上角,這對玩法是很重要的。

左邊的城堡,右邊的神獸,無論多遠永遠都會繪制

然後有一套多光源渲染系統,所以能達到每個螢火蟲都是一個發光源的效果。我沒機會去聽荒野之息渲染的那場cedec,但是泄漏的幾張ppt還有text dump來看,應該是介於延遲渲染和light prepass之間的一種操作:

除此之外整個世界的光影效果都是高度動態化。

基於raymarch的體積光,而不是廉價的徑向模糊方案:

樹影撥動著夕陽灑下的光:

光從視窗灑進室內:

看起來像是基於物理的大氣散射模擬,太陽下山的時候能清楚看到逐像素的大氣變化:

布料,草地等次表面透射的模擬:

可以透過布料看到室內的光源的投射還有物體的遮蔽
荷葉背面也能透光,也有適當的陰影

基於螢幕空間的環境光遮蔽模擬而不是烘培死的光照遮蔽(比如角落裏的陰影,或者陰影中的陰影):

以及在渲染負載小的場景內會開啟一個近距離的螢幕空間反射提供高光細節:

同時也有一個即時更新的離屏反射:

還有基於上述系統生成的即時漫反射全域光:

強烈的直接光照下地板是棕色的
晚上直接光變弱,間接光變強,右側粉色墻壁的顏色反彈到了地板和樹上

另外荒野之息裏還對各種奇形怪狀的面積光做了一些便宜的模擬:

看起來像是對n個點光進行了裁剪

更別說那一整套可高度互動的植被系統:風,物體,切割,燃燒等等。

做一個很簡單的對比:

首先是光榮拿荒野之息的素材做的災厄無雙裏格魯德小鎮的畫面:

缺少直接光的地方看起來約等於unlit了。。。

然後是荒野之息裏的樣子:

畫面的層次感一下就出來了

數毛社17年把荒野之息放在年度遊戲畫面技術第三不是沒有原因的。。。這些技術在主機上並不是很少見,但能最佳化在掌機下流暢執行就不是一個概念了。ResetEra上BrainChild曾經發過一貼寫了一些他的發現:

https://www. resetera.com/threads/ze lda-breath-of-the-wild-the-technical-analysis.8197/

至於任天堂具體怎麽最佳化的,我只能說幾個我觀察到的:

首先是視距,在保證重要物體的視距的時候對細節物體進行一個縮放過度,把中遠距離的細節無縫過渡到地表貼圖上,比如下面的落葉:

連續平滑消失,正常情況下不仔細看基本註意不到

又比如草地,在近距離的時候是一根根的草單獨繪制,而遠處的地方則過度成更節省的紙片草,但是距離遠,不細看也看不出來:

我不說你能輕易看出來遠處的草是一條條面片嗎?

全域光系統也是個重中之重。據我觀測還有網上討論的,荒野之息的做法是在相機位置放了一個探頭,即時捕捉場景光照,然後摺積提供間接漫反射和高光的照明。

但是無論是即時捕捉場景(相當於額外畫n遍場景)還是摺積(高頻寬開銷)對ns這個硬件來說都太耗了。

任天堂的做法是,捕捉場景的時候只捕捉地形+靜態結構+重要物品(比如怪物商店因為那個光照貢獻很明顯),並且捕捉場景時用一個非常簡化的光照模型去繪制,看下圖我合理懷疑可能直接用的頂點色算光照然後插的:

水裏倒映的世界是高度簡化的

但是這樣摺積的開銷也降不下來,所以任天堂最後用了分幀的方法,也就是說每次相機移動的時候,光照探頭的更新會在幾針之內完成,這樣每幀的開銷就低了,所以仔細觀察的話發現會有個微小的延遲。

最後半透明(比如水體)疊起來開銷很大。任天堂做法是水面下的像素,光照在1/4分辨率下計算,配合上cel shading,也是屬於不說基本看不出來的(這個是cedec上任天堂分享的):

水下的鋸齒比水面上的要更多,但這是縮放最大屏攝的情況下,正常遊戲裏你真的看得出來嗎?

其他更多的就得用cemu+renderdoc截幀看了。

客觀來說,第一方遊戲只用上兩個平台,可以針對做最佳化,尤其我沒記錯的話跳票的最後一年epd就是在移植ns,貼合著平台特性大幹特幹,所以結果很不錯。