簡介
這篇是針對 Texture 效能優化做介紹,效能優化很多種,但是優化 Texture 的方向也是很重要且有效的著手點,在一個場景中,假如一顆 HDRP/PBR 材質球,最少需要三張 Texture,而場景可能就需要上百顆材質球,單純在 Unity3D→Project Setting→Quality→Texture Quality 來做調整,確實是可以降低讀取 Texture 資源,但也會讓場景畫質變差,而我們此篇就來使用更有效的 Texture + Mesh Bake來降低耗能。
Texture檔案大小在Unity
我們先來簡單了解 Unity3D 在讀取 Texture 所會佔多少記憶體,我這邊列了幾個格式,單位單一一張貼圖,在 Unity Editor 模式,沒壓縮,自動格式 (PS.在不同的平台會有不同的壓縮圖片模式)。
所以你假如全場景都使用2048*2048,而一顆材質球用三張,有一百顆材質球,所以計算下來就要吃掉至少1.6GB記憶體。可想而知要耗多少資源。
2048*2048 Pixel | 5.3MB |
1024*1024 Pixel | 1.3MB |
512*512 Pixel | 170KB |
Texture + Mesh Baker
這邊我們用一堆樹木做實驗,先看看還沒做 Make 時的 Batches 高達5761,如下圖所示。
我們開始做 Texture + Mesh Bake,首先在前幾篇友分享 Mesh Bake 這套件給大家,就當作大家都已安裝了此套件。
Step1:
新增一個 TextureBaker + MeshBaker 物件,要同步做 MeshBaker 的原因是要把好幾個貼圖Atlas在一張貼圖中,且要把每一個模型的 UV 同步記錄在 Atlas 貼圖,所以必須一起做 Bake 動作。
Step2:
新增好之後會在 Hiertschy 視窗中多了一個 TextureMaker 物件,先將子物件MeshBaker先刪掉。而在 Inspector 視窗中會有如下圖二的兩個程式元件。
Step3:
我們先看到 MB3_TextureBaker 程式,把你要 Baker 的物件拖曳到ObjectsToBeCombined 中,而且會產生物件陣列。
Step4:
接著我們要新增 Atlas(1)(請選擇Atlas格式) 的資料在你 Unity 中,所以請看下圖標示(2)的地方,指向你要儲存的位置。而在標示(3)的地方 ConsiderMeshUVs 必須打勾,讓 MeshBake 物件可以與Atlas相對應。最後按下(4)開始計算有幾個 Texture 與 Material 。(請靜待…)
Step5:
可以看到有很多材質我們就當他每張都2048*2048,接著就看到MB3_MeshBakerGroup,來產出實體物件。我們這邊不需要設定之前篇章有講述過的Grid分割法,先做第一步的Bake。
Step6:
選取 Lightmapping UVs→Generate_New_UV2_layout,做第二步的 Bake。做到這邊其實幾乎完成了,在 Hierarchy 式窗看到實體物件。但有時候我們所選擇的物件會用到很多的 Shader 所以會有材質球顯示不出來的狀況。所以必須要再多一到工,將材質球轉換成 HDRP (這邊就不多贅述),基本上就完成了。可以看到下圖2,套件將所有有用到的物件材質產生出一張4096*4096的 Atlas 材質與材質球。
小結
可以看到經過 TextureBaker + MeshBaker 後,系統的 Batches 減少了10倍。如此方法記憶體(2048*2048*3*材質求數量)-4096*4096*3*1,而實際執行遊戲的FPS也相差了許多。