切換
舊版
前往
大廳
主題

(Unity) VR 優化方式記錄

浪濤書記 | 2019-06-04 13:08:40 | 巴幣 1008 | 人氣 1480


啊... 失業了,
原本是在一家純做頭戴式VR遊戲的公司上班,
不過這種單靠體驗店賺錢的市場似乎不大.....

之後找到的工作跟VR無關,
但世事難料,說不定以後的工作又會接觸到VR,
這裡趁還有些記憶,紀錄一下以前優化的方式。

1.【貼圖壓縮】
將貼圖壓縮至 1024x1024 或 512x512,
基本上 4096、2048、1024在外觀上幾乎看不出差別,
但 1024可以把檔案的大小降低很多,加快讀取的進度,
遠的物件、小的物件可以試著壓更低到 512。

2.【材質合併】
有的物件上有很多Material,可以試著把它合體成一個,
一來降低讀取的檔案大小,二來降低讀取Material的次數,
這部分我是公司幫我美術做掉了,美術用的方法我不知道,
美術離職後我是用插件 Mesh Baker幫我連同下面的第四點模型合併一起處理。

3.【模型減面】
公司的場景是企劃去佈置的,企劃拿過來的場景很完整,
不過有些在牆後的地方,玩家雖然不會看到,但Camera還是會去讀取處理,
所以實際遊玩後:
(1) 把已知看不到的地方整個物件砍掉。
(2) 請美術把特定的面給裁掉。
(3) 遠的物件用 LOD等方式,換成面數較少的模型。
前兩點會讓場景在編輯器裡看起來破破洞洞的,但不影響實際觀看的體驗。

4.【模型合併】
顧名思義,把很多模型變成一個,
比如一個走廊,它的牆壁可能是由8片牆壁組成的長型牆壁,
把8片合成一片,可以把讀取8次的動作變成讀取一次,
模型的檔案大小也能縮小個8倍左右,推薦插件:
(1) Mesh Baker
功能強大,也能同步處理貼圖合併的工作,
但缺點是我覺得使用起來不直觀,
遇到有透明效果的Shader,合併後也容易出錯,
所以盡量合併同一類型的模型,像是上面舉例的多個牆壁變成一片。
另外雖然使用上不直觀,但能同時處理模型、Material、貼圖的合併,
功能強大,暫時沒找到可以替代的,所以還是推薦使用。

一鍵合併模型超方便,附帶移動物件中心位置的功能,
沒有要做貼圖合併的話,推薦使用這個去合併模型。
※另外,這問題不知道有沒有修復,Unity 2018.3.1後的版本,
需要將 Assets/Battlehub/PivotEditor/Scripts/MeshUtils.cs  的第 90行,
string path = "Assets/" + root + "SavedMeshes/" + name + ".prefab";
後面的保存格式從「.prefab」更改為「.asset」,才不會跳錯。

減少 Draw call的利器,使用後的效果超群,
而且算是個自動化合併的插件,使用簡單,
只需要把要合併的物件放在同一個父物件下,
然後在父物件掛上一個腳本,遊戲執行時就會自動幫你搞定模型合併,
不用自己一個一個手動去做合併的動作、做完還要把合併的模型替換到場景上;
另外使用上最好遊戲一開始、玩家可能還在戴頭盔時就去執行腳本,
不要遊戲過程中才啟用,因為腳本執行合併時畫面會閃一下。
然後插件有些設定會牽扯到Unity的原生設定,要注意了解下,
建議還是用(1)(2)去合併模型,真的有需要的話再使用這個插件去輔助。

輔助插件,由於(1)(2)合併出來的模型是.asset的檔案,
如果想用 3d max等軟體對模型再做修改,
使用這個能轉成obj檔案,
這樣就可以丟到3d max裡做編輯、輸出成fbx。

(5) 公司美術
這不是插件,但把模型丟到3d max裡,
由美術手動減面、合併的效果可能會比插件運算出來的好,
像我公司的美術就把原本加總起來將近1GB的多個模型,
硬深深地變成一個只剩 23MB左右的模型,讓我很佩服。

5.【少用 Instantiate產生物件】
用 Instantiate大量產生物件時,
頭盔會看到有白色的讀取畫面在閃爍,造成不良的體驗,
這部分後來是用物件池的方式去解決,物件池的概念可以上網查詢,
不過如果生成的物件不多,繼續用 Instantiate也不是不行。
推薦插件:Pool Manager

6.【少用 Mesh Collider】
有次某個模型我用 Mesh Collider,
我遊戲經過那附近時,大概三分之一的機率遊戲整個爆掉死機給你看。
另外物理碰撞也少用,像是 OnTriggerStay(),
在程式執行這些方式時,我會感覺稍微卡卡的,
可能用 RayCast、Vector3.Distance的方式去偵測目標是否靠近。

7.【少用 Log】
Log蠻耗效能的,公司遊戲有套劇本系統,
之前每讀一條劇本指令,都會跑一條Log訊息,
在大量跳Log時就造成遊戲卡頓,
這裡可能設置一個開關或快捷鍵,預設不跳Log,
只有在需要除錯時,才去顯示Log讀取的狀況。

8.【其它輔助插件】
(1) Log Viewer
遊戲輸出後,用滑鼠在畫面轉一圈,
就能看到 Log輸出的情況,藉此判斷遊戲中是否有跳出錯誤。

遊戲丟到體驗店後,環境因為跟公司不一樣,
可能會跳出一些公司沒測出來的錯誤,
或是公司壓力測試,要大量保留Log日誌時,
能用這個插件把日誌保存下來。
※這插件本身有些問題,
像是它有個覆寫原生 Debug 的程式,會與其他插件的 Debug.Log 衝突,
還有中文Log會變成亂碼,輸出的存檔路徑是寫死的...,
但這些問題能靠自己修改程式碼改善。

一個遊戲場景空間與現實環境空間的比例尺工具。

美術輔助工具,能知道一個物件的檔案大小、面數、...等資訊,
藉此判斷場景哪個部分比較需要去做合併、壓縮貼圖之類的動作。
我會盡量讓場景上同一時間看到的物件,檔案大小總和不會超過500MB,
雖然實際測起來,2GB以下好像都沒問題,
但不排除那是公司硬體好的關係,而且檔案越小本身也比較好。

(5) Profiler
Unity 內建的工具,可以看看到底是執行了什麼造成遊戲卡頓。


以上,內容可能不專業,而且比較像插件推薦,
通常我自己感覺,只要做上面的(1)(5)(6)(7)就差不多了,
不小心點進來的客倌就當參考看看吧,
然後優化上,推薦下面這篇文章,可以一併閱讀。
送禮物贊助創作者 !
0
留言

創作回應

ajurgnoyrvh
剛好有用到,多謝了
2019-12-09 02:30:28
叄實壹
為了把花花草草鋪到場景吃掉了一堆Batch.. 不知道這些能不能用上
2020-06-18 01:40:35

更多創作