1. 程式人生 > >unity優化—資源優化

unity優化—資源優化

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,因為他們總是在攝像機差不多的距離渲染不會有很明顯的距離差
考慮把圖片打包起來變成圖集 把圖塊變成圖集之後會減少Draw Calls的次數(其實就是減少Material 數量)明顯減少CPU消耗,記憶體消耗上基本相同。一個圖集下的所有貼圖都應該是使用相同Shader的,不然後果很嚴重做了還不如不做。 圖集經常使用在UI介面,2d遊戲中,它在手遊中幾乎是必不可少的,因為Draw Calls往往會成為手遊的瓶頸。 我們不應該手動去生成圖集,有很多現成的工具有Unity自己的有第三方的還有一些原始碼工程。要注意圖集不能大於目標平臺的最大要求,圖集最好合理的分佈不要為了節省空間而檢視把圖集塞滿。如果渲染器需要從不同的圖集中呼叫紋理會導致大量的快取記憶體命中失敗,從而有引發記憶體頻寬不足等等問題。 如果做pc遊戲的話圖集就沒有特別的必要了,因為Draw Calls很少會成為pc遊戲的效能瓶頸。正確的使用圖集它不是僅僅把圖片堆起來。 調整非正方形紋理的壓縮率 不建議匯入非正方形或者非2的次冪的紋理到我們的應用程式,因為GPU往往需要把紋理是變成正方形和2的次冪導致不必要的處理畸形的紋理尺 寸工作量。如果紋理不是2的次冪,Unity會scale、pad紋理,以使得達到2的次冪,這樣會花費更多記憶體,讓載入更慢,所以建議是避免匯入非正方形和2的次冪的紋理。 我有時都感覺自己在扯淡了,其實這點優化應該每個遊戲開發人員都應該瞭解,頓時感覺自己sb了 有點沒必要去寫這篇部落格的。