Cornfox & Bros.如何將手遊移植到Switch
我們在著手工作時設定了下列目標:
- 保持儘可能高的畫質水平。
- 實現穩定的幀率。
- 實現原生解析度(TV模式下1080p,掌機模式下720p)。
- 通過動態解析度使用超取樣抗鋸齒取代多重取樣抗鋸齒(用於iOS中)或臨時抗鋸齒(用於Mac)。
- 使用移動端渲染器取代PC渲染器,因為我們要優先確保解析度,而不是渲染功能。
為了進行Switch移植,我們與工作室Engine Software進行了協作。總的來說,我們制定的目標對Switch硬體提出了很高要求,因為它配備的是三個時脈頻率比較低的CPU核心。
第一次迭代
我們的第一次Switch迭代僅達到13幀/秒的執行速度。而在iOS上,我們開發時的目標是30幀/秒。當Apple Arcade首次公佈時,我們還不清楚它支援的最老的裝置是什麼(後來知道是iPhone 6系列)。把目標定在30幀/秒能讓我們保持很高的解析度,而且最重要的是,電池的電量消耗不會太高。
解決方案
在30幀/秒的速度下,可以用33.3毫秒來渲染一幀畫面,而我們初步得到的結果卻很不幸,每幀需要近80毫秒。我們感到很困惑:這個遊戲已經針對移動裝置優化過了。我們忽略了什麼?後來的事情表明,忽略了很多。新型的蘋果移動裝置擁有比Switch更強大的CPU——這使我們可以忽略許多資源沒有得到高效利用的情況。於是我開始分析這款遊戲並尋找答案。
主機遊戲和移動端遊戲的區別是,在移動平臺上,效能會根據後臺應用程式、電池電量和裝置溫度進行調整。而在主機上,如果遊戲有穩定的效能,你就知道它會始終如一。
我開始進行優化,我的方法就是尋找所有執行緩慢的藍圖,把它們移植到C++。只用兩天時間,我就把渲染時間從最初的結果削減了20毫秒。這些立竿見影的成果讓我想到,肯定還有另一些可以輕鬆實現的優化是我們沒有做的。其中一個很快就被我找了出來:一些關卡有超過5000個Actor——這個數字遠遠超過推薦的數量。雖然iOS裝置處理這麼多Actor不是什麼大問題,但Switch版不經過大手術是做不到的。
我統計了每一幀中有多少Actor會發生更新,發現這個數字超過了1000。除此之外,還有近1500個會更新的元件。這就是我們要解決的問題。我們要做的第一件事就是減少每幀的更新數量。下面是我們的發現和節省渲染時間的方法:
- 有些Actor在更新中基本上沒做什麼。對於這類Actor,我們要麼完全禁用更新,要麼就顯著延長更新間隔。
- 有些Actor會手動查詢重疊。對這類Actor可以進行重構,使用重疊事件取代查詢,而且僅在事件發生後暫時啟用更新。
- 有些Actor執行的操作只和視覺效果有關,但是玩家卻看不到。為了解決這個問題,我們使用了視錐體、距離、動態和靜態遮蔽剔除,然後只更新可見的Actor。
- 有些Actor執行的操作從技術角度來說是可見的,但是距離太遠,玩家不會注意到。例如,在白市,任何時候的角色總數都超過300個,但是在玩家周圍通常只有10個左右——只有這些角色才是需要更新的。
虛幻引擎提供了一些方法來優化這些情況;但是,團隊有責任做出明智的決策,有時候需要選擇性使用或自定義程式碼。在這次移植中,我們新增和刪除了一些程式碼,同時也使用了內建的優化;例如,我們使用了動畫tickrate。
另一個拖慢速度的因素來自地形青草系統。這個系統會在地形上動態生成數以百萬計的青草和其他植物網格體。我們發現它每幀要佔用多達2.5毫秒。我們注意到,我們對不同地形圖層使用不同型別植物的方法會生成許多空的批次。這個問題很好解決,只需要讓元件的每個特定植物型別的權重為零時提前退出即可。這個系統還會更新來自地形的所有元件。為了解決這個問題,我們首先確定任何植物型別的最大距離是多少,然後只更新那些在此範圍中的元件。我們把地形元件從4000個減少到了10個(在玩家身邊的那些),從而使渲染時間縮短到0.1毫秒。如果你覺得這些優化會令你的專案受益,那麼我們要高興地告訴你,我們已經在GitHub上的最新虛幻引擎版本中提供了它們。
最後但同樣值得注意的是,Engine Software實現了一種叫做Actor Tick Batching的技術,它曾被用於《盜賊之海》。Actor Tick Batching能減少指令快取缺失並開啟其他優化可能,例如減少重複工作或根據Actor距離執行更新速度優化。
這一切努力造就了經過高度優化的《海之號角2:失落王國的騎士》移植版,它將在2020年秋季登陸任天堂Switch。感謝閱讀本文!
來源:虛幻引擎
原文:https://mp.weixin.qq.com/s/3lx3I3LFySDSkdm1fgqVxw
相關文章
- 如何將 Google Auto Draw 移植到小程式上Go
- 如何將三萬行程式碼從Flow移植到TypeScript?行程TypeScript
- 將 Win32 程式移植到 LinuxWin32Linux
- Steve Yegge 將 Rails 移植到 Javascript/RhinoAIJavaScript
- 知名安卓模擬器將支援手遊移植Steam平臺安卓
- 探索將scratch3移植到樹莓派樹莓派
- 如何把 awk 指令碼移植到 Python指令碼Python
- 如何優雅的移植JavaScript元件到BlazorJavaScript元件Blazor
- 《不可思議之夢蝶》專案從PC版移植到Nintendo Switch經驗分享
- 如何將複雜的應用邏輯從儲存過程移植到業務層儲存過程
- 鑑於Switch遊戲流行,任天堂或將縮減手遊開發規模遊戲
- 開發者分享優化技巧,將PC VR內容移植到Quest優化VR
- 將30K行Flow程式碼移植到TypeScript - davidgomTypeScriptGo
- 將 Linux 應用程式移植到 64 位系統上Linux
- 怎樣將Xilinx的xfOpenCV庫移植到ZedBoard平臺OpenCVZed
- 上海一公司需要將原系統移植到Websphere平臺Web
- 面對遊戲移植,Switch的效能還有得“榨”嗎?遊戲
- 如何移植32位程式到64位系統薦
- 移植到 Python 3Python
- 《奧日與精靈意志》是如何完成近乎不可能的Switch移植任務的?
- 從Steam移植手遊的遊戲是否會成為主流?遊戲
- 移植到Windows CE 的經驗Windows
- alsa 移植到Linux3.0Linux
- oracle移植到mysql注意事項OracleMySql
- ffmpeg在移植到海思HI35xx平臺之將ffmpeg庫引入到sample的demo中
- 手把手教您將libreoffice移植到函式計算平臺函式
- 倪光南院士建議將Windows應用移植到國產作業系統Windows作業系統
- Charilaos Kalogirou:分享將iOS遊戲移植到Android平臺的注意要點iOS遊戲Android
- ubuntu移植到嵌入式平臺Ubuntu
- 遊戲移植Switch平臺要注意什麼?《DARQ》開發者分享實戰經歷遊戲
- 3.0 ORACLE移植到MYSQL改造注意要點OracleMySql
- 移植一個抖音貼紙元件到Flutter元件Flutter
- RT-Thread移植到stm32thread
- Solaris到Linux應用的移植(轉)Linux
- web工程從TOMCAT移植到JBOSS中WebTomcat
- 資料移植到Oracle資料庫(一)Oracle資料庫
- 如何將MacBook連線到電視?Mac
- 移植Switch、支援次世代主機,Unity如何幫助《深海迷航》在5個平臺上觸達600萬玩家Unity