Related Posts Plugin for WordPress, Blogger...

6-19 Super Level Optimizer

本章要來介紹插件『Super Level Optimizer』。首先,如果大家常看Unity 效能優化相關的文章,肯定都會看到Mesh Combine以及Texture Atlas。

理解優化的時候,注意CPU與GPU的差異。任何優化的第一規則都是查明性能瓶頸在哪裡,因為優化GPU和優化CPU的策略常常是不同的(甚至常常是相互對立的——常常為了優化CPU而把它的一些工作交給GPU,反之亦然)。


GPU常常受限於填充率和存儲器帶寬。如果遊戲在較低的顯示解析度上運行更快,則很可能是受限於GPU的填充率。

CPU常常受限於需要渲染的物品數量,我們通常叫它「draw calls」,如果在PC上它常常多達幾千個,或者在移動設備上多達幾百個,那麼你可能需要優化物體的數量。

CPU優化:draw call數量
為了渲染一個物體到螢幕上,CPU需要做一些工作——比如,哪些燈光影響物體,建立著色器和著色器參數,給顯卡驅動發送繪製命令,然後準備發送給顯卡的命令。單個物體的CPU開銷並不昂貴,但是如果有很多可見物體,這些開銷會累加。

所以,舉例來說,比如你有1000個三角形,相比每個三角形一個獨立的網格,它們都在一個網格中對CPU開銷要低得多。這兩種方案對於GPU來說差別不大,但是CPU渲染1000個物體(代替1個)的開銷多很多。

為了讓CPU做更少的工作,減少可見對象的數量是很有效的:合併接近的物體。可以手工合併,也可以利用Unity的drawcall batching(批量draw call)。

Texture Atlas:在物體中使用更少的材質。可以把獨立的紋理合併成一個更大的紋理圖集。

Mesh Combine:合併物體使每個網格有至少幾百個三角形,並且整個網格只使用一種材質。合併兩個不共用同一材質的物體並不會提升性能,理解這一點很重要。擁有多個材質的最常見原因是兩個網格不共用相同的紋理,所以為了優化CPU性能,你要確保合併的物體共用相同的紋理。

上述說明參考自:Unity3D圖形性能優化最佳攻略
https://read01.com/O3K4em.html#.Wv6aqtOFOi4

GPU優化:LOD和Occlusion Culling
https://3dactionrpg.blogspot.tw/2018/01/5-2-level-of-detail-lod.html
https://3dactionrpg.blogspot.tw/2018/01/5-3-occlusion-culling.html

所以前面提到的Mesh Combine及Texture Atlas為CPU優化的範疇,如果你的遊戲專案中Draw Call非常高,就可以考慮使用『Super Level Optimizer』插件進行優化。以下有原作者提供的教學影片,非常詳細。


接著簡單介紹我的使用經驗。安裝完插件後,選擇Tools/NGSTools/SuperLevelOptimizer/Create Optimizier。

接著場景中會建立一個GameObject名為SuperLevelOptimizer。

從Inspector中可以看見很多選項,首先選擇Create Atlases來合併相似的Shader到同一個Material中吧。

由於Shader中的設定可能會有部分不同,開啟Coefficient Table可以設定容錯值,也就是Shader之間的數值差異只要在設定參數內,仍可以合併成同一個Material。

接著合併中。

合併完以後,可看見Assets資料夾自動出現了SLO/Atlases。

其中可以發現紋理都合併了,紋理的尺寸會自動以2的冪次方儲存,其原因主要是早期部分顯卡不支援非2的冪次方。若是用在UI圖的話,則是跟Unity使用的圖片壓縮技術有關。相關資訊可以參考下列網址:

【Unity3D】图片纹理压缩方式,干货走起!
https://blog.csdn.net/swj524152416/article/details/54911103

为什么要把资源贴图都放在一张图上?
https://www.zhihu.com/question/29738513

接著使用Combine Mesh功能。

原本分開的橋被合併在一起了。

房屋也因為使用同一個紋理而合併在一起。

合併以後,場景會自動出現Colliders跟Combined Meshes。

合併以後有可能會出現一些問題,如下圖為啟動Occlusion Culling的情況,攝影機是不會拍到主角身後的物品,但卻依然顯示出來,消耗GPU的資源。

為了解決這個問題,可以在Super Level Optimizer中的Bake Type,選擇Zonal。

設定以後如下圖,會將場景分割從不同的區塊,僅會將區塊內使用同紋理的物件進行Mesh Combine。

再來比較我的遊戲中的案例,情境為上圖中Combine特別明顯的房屋建築群。

首先是完全沒使用Mesh Combine的情況,Batches為124,FPS為41.2,Tris為152.2k。

再來是使用了Mesh Combine,Batches為125,FPS為48.5,Tris為306.8k。

從實驗結果中可見,FPS與Batches的改善並沒有那麼明顯,主因應是我的遊戲目前的瓶頸,使用這個方式是暫時無法改善的。首先,場景中的物件並沒有多到會大量影響Draw Call,再來,Tris的數量增加兩倍,有可能是因為Mesh合併在一起之後,導致Occulsion Culling的運作並未最佳化,如主角身後的建築群依舊在顯示。

所以,這個場景較不適用Super Level Optimizer。

留言