Unity資源優化詳解

2021-10-01 10:57:32 字數 4052 閱讀 1317

首先從聲音開始

在unity5中匯入聲音檔案我們能看到類似下面的面板 ,我們先看第乙個選擇load type,他有三個可值:decompress on load,compressed in memory,streaming。

(1)decompress on load

在硬碟上壓縮這個檔案,並在第一次載入到記憶體的時候解壓它,這是載入聲音檔案的預設選項,大多數情況下我們應該使用這個選擇 。

載入後解壓縮聲音,聲音檔案將在他們載入不久後就解壓,這個選項適用於較小的壓縮聲音,以避免即時解壓縮的效能開銷。要知道在載入時解壓 vorbis編碼的聲音將使用的記憶體是壓縮狀態的十倍或更多(adpcm編碼大概3.5倍)所以不要使用此選項用於大檔案。

decompress on load 預設選項適用於小檔案。

(2)compressed in memory

在效能視窗可以看"dsp cpu"。

注:compressed in memory適用於大檔案。

(3)streaming 選項

直接從磁碟流音訊資料。這只使用了原始聲音佔記憶體大小的很小一部分。

該方法使用最少的記憶體和最多的cpu,它有個很明顯的缺點就是不能被引用超過一次。試著讓audio clip產生多個副本的時候會每個都產生資料緩衝區,如果非要這麼做會產生大量的記憶體和cpu消耗。因此這個選擇最好是給單例項的audio clip,如背景和環境音效。對於手遊而言不要優先考慮使用這種方式。

其他一些載入設定

在場景中把一 個audio clip賦值給audio source元件,這個音訊檔案將在場景初始化的時候載入到記憶體中。但是如果它啟用了,載入audio clip就變成了乙個後台任務它將推遲到場景初始化完成後再載入,換句話說就是在遊戲開始後開始載入。

preload audio data

聲音檔案的編碼格式和質量

unity支援三種聲音檔案編碼格式的,由於平台依賴性在某些特殊情況下會有其他的選項(如xbox one的xma和ps vita的hevag )

我們匯入到unity的音訊檔案可能是各種各樣常見的音訊格式,但通過內容管道,standalone、webgl和其他的一些非移動平台使用ogg-vorbis格式的壓縮,而移動平台使用mpeg-3(***)格式。

pcm 提供高品質但犧牲檔案大小最適合使用在很短的音效上。

adpcm 這種格式適用於大量音效上如腳步爆破和**,它比pcm小3.5倍但cpu使用率遠低於vorbis/***

vorbis/*** 比pcm小但是品質比pcm低,比adpcm消耗更多cpu。但大多數情況下我們還是應該使用這種格式,這個選擇還多了個quality可以調節質量改變檔案大小

增強音訊效能

儘量減少音訊數量

減少audioclip引用

場景中每個audio source的audio clip引用和preload audio data 啟用都將消耗一定量的記憶體(壓縮解壓或者快取),這些記憶體將貫徹整個場景,如果兩個或兩個以上的audio source引用相同的audio clip沒有額外的記憶體消耗。audio clips在unity中是非託管資源這意味著他們不會通過設定為null釋放記憶體。

unity希望我們能夠載入和釋放這些資源,經常使用的音效長久的在記憶體中儲存檔案是合理的,因為每次載入乙個檔案到記憶體中都會消耗cpu。然而,如果我們發現因為音效而使用太多的記憶體的時候,我們必須做出艱難的選擇是降低音訊質量還是完全移除他們來節省記憶體。另一方面,儲存不常用的音效在乙個很長的場景中將會造成重大問題。

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就一點用都沒只是在浪費空間。還有如果只有單一的一種遠距離物體我們也應該禁用它,應該從原紋理縮放乙個小紋理給這個遠處物體。

以下時候應該禁用這個選項:

考慮把打包起來變成圖集

把圖塊變成圖集之後會減少draw calls的次數(其實就是減少material 數量)明顯減少cpu消耗,記憶體消耗上基本相同。乙個圖集下的所有貼圖都應該是使用相同shader的,不然後果很嚴重做了還不如不做。

圖集經常使用在ui介面,2d遊戲中,它在手遊中幾乎是必不可少的,因為draw calls往往會成為手遊的瓶頸。

我們不應該手動去生成圖集,有很多現成的工具有unity自己的有第三方的還有一些原始碼工程。要注意圖集不能大於目標平台的最大要求,圖集最好合理的分布不要為了節省空間而檢視把圖集塞滿。如果渲染器需要從不同的圖集中呼叫紋理會導致大量的快取記憶體命中失敗,從而有引發記憶體頻寬不足等等問題。

如果做pc遊戲的話圖集就沒有特別的必要了,因為draw calls很少會成為pc遊戲的效能瓶頸。正確的使用圖集它不是僅僅把堆起來。

調整非正方形紋理的壓縮率

不建議匯入非正方形或者非2的次冪的紋理到我們的應用程式,因為gpu往往需要把紋理是變成正方形和2的次冪導致不必要的處理畸形的紋理尺 寸工作量。如果紋理不是2的次冪,unity會scale、pad紋理,以使得達到2的次冪,這樣會花費更多記憶體,讓載入更慢,所以建議是避免匯入非正方形和2的次冪的紋理。

Unity 資源優化

一 模型 匯入模型選項 import不需要的都不選 網格壓縮預設沒有,可以根據需要選擇壓縮層度 不會對網格寫入就不勾可讀寫 rig頁面 勾選optimize game object,骨骼節點合併了。動畫頁面,沒有動畫就不勾。有可以選動畫壓縮 但要注意壓縮關鍵幀會不會掉幀 二 紋理 不要匯出dds格式...

Unity優化 資源優化之紋理優化

unity3d引擎處理紋理 不論你匯入的是png,psd還是tga,它們都會被自動轉換成unity自己的texture2d格式。美術資源規範 貼圖長寬應為4的倍數 不同平台的圖集格式選擇方案 textureimporterformat android rgb compressed etc1 4 bi...

Unity 資源載入

本地載入 不能載入ab包 object obj resources.load 資源名稱或路徑下的名字 不需要副檔名 t t1 resources.load 資源名稱或路徑下的名字 不需要副檔名 表示載入resources目錄下指定的資源 object objs resources.loadall 資...