unity優化—資源優化
阿新 • • 發佈:2019-01-02
Texture檔案
-----------------------------------------------------------------------------------------------
術語“Texture” 和“Sprite”新手在遊戲開發中經常會產生困惑,所以值得區分下,在Unity3d中Texture僅僅是個圖片,我習慣讀作貼圖。本質上來講它是一個大的顏色陣列告訴程式每個畫素是什麼顏色。
而Sprite是一個2d網格,一個平對著當前攝像機的quad,我習慣讀作精靈。
還有一種東西叫做Sprite Sheets,我們稱它為圖集;它用一張大圖包含了很多圖片,最常見的使用時2d角色動畫。這些檔案可以用Unity的Sprite Editor工具分割成小圖做幀動畫。
別管這些令人困擾的命名,來簡單談下Texture:我們匯入的這些圖片檔案一般都生成於Adobe Photoshop國內基本都是或者一些小眾軟體Gimp等。在執行的時候這些檔案被載入到記憶體中,然後push到GPU,應用Shader完成一次Draw Call。一般情況下,渲染一次擁有一個網格並攜帶一種材質的物體便會使用一次Draw Call,Draw Call的次數是決定效能比較重要的指標。
壓縮格式
像音訊檔案一樣,Unity為我們多種檔案壓縮技術來更有效的儲存檔案。在匯入Texture檔案時,有幾個選項我們可以設定。首先是
Texture Type ,這個設定不會影響到檔案本身而是說Unity將如何解析,操作和壓縮它。
在Texture Type為Texture模式下Unity只給我們看到四個格式選項Compressed, 16-bit,True Color和Crunched。
如果我們將Texture Type設定為Advanced,那麼我們就有了更多的設定選項,它給了我們更多的 Texture解析的控制權。
紋理的壓縮方式取決於大小和質量的平衡,更多的需要做的是瞭解每種格式來選擇最適合的。但是這裡著重要提一下的是Crunched格式,這個格式壓縮需要很長時間,但在執行時減壓是非常快。
在新版本的Unity中加入了這個選擇可以看到它被壓縮成PVRTC格式,推薦在開發手機應用程式時使用 PVRTC 紋理。你應該知道當使用 PVRTC 時與標準JPEG或PNG影象相比有可能有些影象質量的下降。是否值得在你的程式中做出一些犧牲取決於一些因素,但使用 PVRTC 紋理可以節省大量的記憶體空間,PVRTC 是個很好的選擇。
明智的使用 Mip Maps
呈現小物件的時候,像岩石樹木這樣的遠處物體,一個高精度的貼圖對於玩家來說是沒有意義的,因為看不到那麼多的細節。但是如果使用這張高精度的貼圖會損失原本不應該的效能,這時候需要一個較少細節的紋理來提升程式效能。
Mip Maps的發明就是來解決這個問題 的,通過啟用 Generate Mip Maps
它會自動產生不同解析度的多張相同紋理。在執行的時候,GPU根據在透視投影下出現的面積選擇適當的Mip Map(這是一種叫做 texel-to-pixel ratio的技術 )。需要注意的是這些貼圖副本 是在Editor裡面生成的不是在執行時生成的。
聽 著好像很爽的樣子但是他在我們手遊中幾乎沒用,啟用Mip Maps還會讓最後生成的紋理檔案增大33%左右。那他存在的意義何在如何什麼時候使用它呢?它唯一有用的地方是攝像機需要渲染不同距離的紋理時。如果我們的紋理總是呈現在攝像頭的同樣距離,這時候開啟Mip Map就一點用都沒只是在浪費空間。還有如果只有單一的一種遠距離物體我們也應該禁用它,應該從原紋理縮放一個小紋理給這個遠處物體。
以下時候應該禁用這個選項:
- 在2d遊戲中的幾乎所有的紋理(2d遊戲正交投影不存在近大遠小)
- UI介面
- Mesh貼圖,Sprites,Particle Effects,因為他們總是在攝像機差不多的距離渲染不會有很明顯的距離差