摘要:[Unity] 記憶體爆掉了?! 要不到8M的記憶體?!
[出處]
[內容]
在專案中,當X區不斷有大量玩家進出時 會很容易就當機,Unity會跳出一個需要配置8388608Byte的crash log
成因:
Unity的assetbundle實際上是一個透過lzma演算法壓縮過的格式而lzma在壓縮的時候可以進行一些格式相關的設定,例如字典檔大小,fast byte大小,match finder等等
Unity在壓縮時使用lzma的預設值,會去配2的23次方的字典檔大小(8388608Byte, 8MB)
詳情可以參考Lzma 設定根據Unity的Source Code,Unity會在WWW下載完以後對assetbundle進行解壓縮的動作
如此才能將內容load到記憶體之中
這時Unity會另外開一條thread執行解壓縮的動作,並根據assetbundle的內容決定該配多少記憶體給他,其中佔很大一部份的就是字典檔
按照Unity的預設設定,一個字典檔是8MB,所以就必須配置8MB的空間給他
因此當很多檔案同時解壓縮時
Unity就會需要配置 檔案數量x8MB的記憶體空間
例如同時解壓縮40個檔案就是40×8=320MB
由於這8MB必須是連續空間,因此當系統的記憶體被用到一定程度時
很容易就會找不到足夠大的空間來配置8MB給Unity
當Unity配置不出8MB時就會丟出exception讓程式當機
==
解決方法:
使用 unity lzma修改檔
這個專案可以build出一個名稱為lzma.exe的執行檔,他的作用是接收Unity送過來的資料
接著重新更改壓縮參數後再去呼叫真正的lzma來執行壓縮的動作
參數的設定主要是Program.cs的26行
string lzmaArgs = “e ” + args[1] + ” ” + args[2] + ” -a1 -d16 -mt4 -fb128 -mc0 -lc0 -pb0 -mfbt2″;
以上是目前研三用的設定,將字典檔設定為64kb大小,使壓縮檔不會增加太大,而記憶體的需求又可以降得很低
build出來以後的安裝說明
先到Unity的安裝目錄下G:\Unity\Editor\Data\Tools
找到一個lzma.exe, 這是原本unity用的lzma壓縮程式,將這個程式重新命名為lzma_real.exe
再將上面專案build出來的lzma.exe放到這個位置,讓Unity以為這個檔案是他要呼叫的lzma.exe(執行順序: Unity->lzma.exe->lzma_real.exe)
註 : 或許可以做記憶體管理的動作看看?! 做 MEMORY REUSE ?
======
鸞鳳翎毛雨壓垂,
此時應被雀輕欺,
忽朝一日雲霄霽,
依舊還教振羽衣。
======
歡迎轉錄文章,
但記得保留網址和作者名稱~