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
- 面對遊戲移植,Switch的效能還有得“榨”嗎?遊戲
- 將 C++程式移植到 Android 平臺C++Android
- Parquet.Net: 將 Apache Parquet 移植到 .NETApache
- 探索將scratch3移植到樹莓派樹莓派
- 鑑於Switch遊戲流行,任天堂或將縮減手遊開發規模遊戲
- 如何把 awk 指令碼移植到 Python指令碼Python
- 【原創】EtherCAT主站IgH解析(二)-- 如何將Igh移植到Linux/Windows/RTOS等多作業系統移植指南LinuxWindows作業系統
- 如何優雅的移植JavaScript元件到BlazorJavaScript元件Blazor
- 《不可思議之夢蝶》專案從PC版移植到Nintendo Switch經驗分享
- 將30K行Flow程式碼移植到TypeScript - davidgomTypeScriptGo
- 又是手遊,又是移植,索尼想幹什麼?
- 從Steam移植手遊的遊戲是否會成為主流?遊戲
- 單機轉手遊之痛:如何在移植的同時,體面的賺錢
- mplayer 移植到 arm 心得
- 遊戲移植Switch平臺要注意什麼?《DARQ》開發者分享實戰經歷遊戲
- 將手游完美“搬”到大屏,騰訊先遊即將推出家庭遊娛套裝
- 開發者分享優化技巧,將PC VR內容移植到Quest優化VR
- 手把手教您將libreoffice移植到函式計算平臺函式
- 《奧日與精靈意志》是如何完成近乎不可能的Switch移植任務的?
- 知名安卓模擬器將支援手遊移植Steam平臺安卓
- 移植ffmpeg到VC環境心得
- ffmpeg在移植到海思HI35xx平臺之將ffmpeg庫引入到sample的demo中
- 蘋果將推類switch遊戲機,掌機難道又要火了?蘋果遊戲
- RT-Thread移植到stm32thread
- ubuntu移植到嵌入式平臺Ubuntu
- 來自 LumiaWoA 的“黑客攻擊”:將 Windows10 系統“移植”到微軟安卓手機及 Surface Duo 裝置上黑客Windows微軟安卓
- 預計2020年印度手遊市場價值將達到11億美元
- win10系統下如何將圖片匯入到iphone手機Win10iPhone
- 3.0 ORACLE移植到MYSQL改造注意要點OracleMySql
- 移植Rxjs中部分常用operators到陣列JS陣列
- 移植Switch、支援次世代主機,Unity如何幫助《深海迷航》在5個平臺上觸達600萬玩家Unity
- 如何將手機裡的資料自動備份到鐵威馬NAS?
- pentaho7.0將資料庫移植成mysql資料庫MySql
- 那些PC市場裡取得成功的遊戲,卻在移植手遊時吃癟了遊戲
- 《鬼泣-巔峰之戰》產品分析:如何將ACT遊戲改編成ARPG手遊 遊戲
- Serious Bros.宣佈《幻想地球(Imagine Earth)》將於5月9日登陸macOS平臺ROSMac