[Unity] 記憶體爆掉了?! 要不到8M的記憶體?!

  • 2966
  • 0

摘要:[Unity] 記憶體爆掉了?! 要不到8M的記憶體?!

[出處]

http://wz.sytes.net/wordpress/2013/01/29/unity-%E6%95%88%E8%83%BD-www-%E4%B8%8B%E8%BC%89assetbundle%E8%A8%98%E6%86%B6%E9%AB%94%E5%95%8F%E9%A1%8C/

[內容]

在專案中,當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 ?

======

鸞鳳翎毛雨壓垂,

此時應被雀輕欺,

忽朝一日雲霄霽,

依舊還教振羽衣。

======

歡迎轉錄文章,

但記得保留網址和作者名稱~