Unity效能優化之記憶體篇

2021-10-08 23:10:12 字數 2265 閱讀 7769

效能優化,進無止境-記憶體篇(上)

效能優化,進無止境---記憶體篇(下)

本篇主旨是總結兩篇內容的重點,細節還請在作者文章檢視。

1.資源記憶體占用;2.引擎模組自身記憶體占用;3.託管堆記憶體占用。4.記憶體洩露。5.無效的mono堆記憶體開銷。6.資源冗餘。

資源的記憶體占用往往佔據了總體記憶體的70%以上。

因此,資源使用是否恰當直接決定了專案的記憶體占用情況。

資源主要可分為如下幾種:

紋理(texture)、網格(mesh)、動畫片段(animationclip)、音訊片段(audioclip)、材質(material)、著色器(shader)、字型資源(font)以及文字資源(text asset)等等。

其中,紋理、網格、動畫片段和音訊片段則是最容易造成較大記憶體開銷的資源。

紋理壓縮格式可參考文章:unity - 紋理壓縮

一、紋理:

紋理資源可以說是幾乎所有遊戲專案中佔據最大記憶體開銷的資源。

乙個6萬麵片的場景,網格資源最大才不過10mb,但乙個2048x2048的紋理,可能直接就達到16mb。

因此,專案中紋理資源的使用是否得當會極大地影響專案的記憶體占用。

(1)紋理格式:

不僅影響著紋理的記憶體占用,同時還決定了紋理的載入效率。

根據硬體的種類選擇硬體支援的紋理格式。

android平台的etc、ios平台的pvrtc、windows pc上的dxt等等。

色階問題:

由於etc、pvrtc等格式均為有失真壓縮,因此,當紋理色差範圍跨度較大時,均不可避免地造成不同程度的「階梯」狀的色階問題。

可以使用rgba32/argb32格式來實現更好的效果。該壓縮會造成很大的記憶體占用。一定要慎重使用rgba32或argb32格式的紋理壓縮。

更為明智的選擇是儘量減少紋理的色差範圍,使其盡可能使用硬體支援的壓縮格式進行儲存。

etc1 不支援透明通道問題:

建議研發團隊將透明貼圖盡可能分拆成兩張,rgb24位紋理和alpha8紋理。通過特定的shader來進行渲染,從而來達到支援透明貼圖的效果。

該方案可以有效降低紋理的記憶體占用。

目前已經有越來越多的裝置支援了opengl es 3.0,這樣android平台上你可以進一步使用etc2甚至astc,這些紋理格式均為支援透明通道且壓縮比更為理想的紋理格式。

(2)紋理尺寸

一般來說,紋理尺寸越大,則記憶體占用越大。

如果512x512的紋理對於顯示效果已經夠用,那麼就不要使用1024x1024的紋理,因為後者的記憶體占用是前者的四倍。

(3)mipmap功能。

mipmap旨在有效降低渲染頻寬的壓力,提公升遊戲的渲染效率。

但是,開啟mipmap會將紋理記憶體提公升1.33倍。

絕大多數ui均是渲染在螢幕最上層,開啟mipmap並不會提公升渲染效率,反倒會增加無謂的記憶體占用。

(4)read/write

建議研發團隊密切關注紋理資源中該選項的使用,因為開啟該選項將會使紋理記憶體增大一倍(會增加乙份拷貝在記憶體裡)。

二、網格

normal、color和tangent,這些資料的存在將大幅度增加mesh資源的檔案體積和記憶體占用。

佔據較大記憶體開銷的是這兩處:webstream 和 serializedfile。其絕大部分的記憶體分配則是由assetbundle載入資源所致。

目前unity所使用的mono版本存在乙個很嚴重的問題:

mono的堆記憶體一旦分配,就不會返還給系統。這意味著mono的堆記憶體是只公升不降的。

通過工具和經驗進行判斷記憶體是否發生洩漏。

在此有必要說明一下,以上兩種情況均不能表明記憶體存在洩漏問題。

造成記憶體不能完全回落的情況有很多。

比如資源載入後常駐記憶體以備後續使用、mono堆記憶體的只公升不降等等,這些均可造成記憶體無法完全回落。 

避免一次性堆記憶體的過大分配。

避免不必要的堆記憶體開銷。

一、assetbundle打包機制出現問題

同乙份資源被打入到多份assetbundle檔案中。

二、資源的例項化所致

大量例項化物件導致冗餘資源過多,過多的冗餘資源卻為resources.unloadunusedassets api的呼叫效率增加了相當大的壓力。

android效能優化之記憶體優化

android記憶體問題分為記憶體抖動和記憶體洩漏。記憶體抖動是指短時間內有大量物件建立銷毀,它伴隨頻繁的gc。記憶體洩漏是指程式中已動態分配的堆記憶體由於某種原因未釋放或無法釋放,造成系統記憶體的浪費,長生命週期物件持有短生命週期物件強引用,從而導致短生命週期物件無法被 記憶體問題常常發生在處理與...

WindowsXP優化之記憶體篇

一 關閉 系統還原 功能 系統還原 功能是windows系列作業系統的乙個重要特色,這一功能的最初僅限於 當windows執行出現問題後,還原作業系統。到windows xp,進了一步,除了還原作業系統,還可還原私人資料,如 word文件,繪圖資料,email甚至是瀏覽器的歷史資料等等。系統還原 雖...

Unity記憶體優化之記憶體洩漏 記憶體冗餘

記憶體洩漏的廣義定義 在電腦科學中,由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體,記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費。後果 記憶體洩漏會因為減少可用記憶體的數量從而降低計算機...