AssetBundle壓縮/內部結構/下載和加載


一、AssetBundle的壓縮方式

  Unity支持三種AssetBundle打包的壓縮方式:LZMA, LZ4, 以及不壓縮。
 
 1、LZMA壓縮方式
 是一種默認的壓縮形式,這種標准壓縮格式是一個單一LZMA流序列化數據文件,並且在使用前需要解壓縮整個包體。LZMA壓縮是比較流行的壓縮格式,能使壓縮后文件達到最小,但是解壓相對緩慢,導致加載時需要較長的解壓時間。
 
 2、LZ4壓縮方式
 Unity支持LZ4壓縮,能使得壓縮量更大,而且在使用資源包前不需要解壓整個包體。LZ4壓縮是一種“Chunk-based”算法,因此當對象從LZ4壓縮包中加載時,只有這個對象的對應模塊被解壓即可,這速度更快,意味着不需要等待解壓整個包體。LZ4壓縮格式是在Unity5.3版本中開始引入的,之前的版本不可用。
 
 3、不壓縮的方式
 不壓縮的方式打包后包體會很大,,導致很占用空間,但是一旦下載Assetbundle,訪問非常快。不推薦這種方式打包,因為現在的加載功能做的很友好了,完全可以用加載界面來進行后台加載資源,而且時間也不長。
 
二、壓縮包的緩存
    WWW.LoadFromCacheOrDownload函數能下載和緩存資源包到磁盤中,從而能大大加快以后的加載。從Unity5.3開始,緩存數據也可以用LZ4算法壓縮,相對於不壓縮緩存數據,這能節省40%——60%的的空間。在下載期間進行壓縮,因此用戶幾乎是感覺不到的。從套接字(Socket)接收的數據,Unity將對它進行解壓並且用LZ4格式壓縮它。這種壓縮發生在以流的形式下載過程中,這意味着一旦足夠的數據被下載了,緩存遍開始壓縮,並且這樣一致持續到下載完成。之后在需要使用的時候,數據從緩存中通過飛速解壓的方式讀取出來。
  緩存壓縮是默認啟用的,它是由Caching.compressionEnabled屬性控制的,它能影響到在磁盤中保存的資源包以及緩存在內存中的資源包。
 
三、AssetBundle加載API概述
以下這張表是當使用不同的壓縮方式和不同的加載方法時,內存和性能的開銷情況比較:
      
   不壓縮  LZ4壓縮 LZMA壓縮 
 WWW加載 內存:未壓縮資源包的大小(+當WWW未被Disposed時未壓縮資源包的大小)
性能:沒有額外的處理過程
 內存:LZ4高壓縮包的大小(+當WWW未被Disposed時LZ4高壓縮包的大小)
性能:沒有額外的處理過程
內存:LZ4壓縮包的大小(+當WWW未被Disposed時LZMA壓縮包的大小)
性能:當下載的時候,LZMA解壓過程+LZ4壓縮過程
 LoadFromCacheOrDownload加載 內存:沒有額外內存占用
性能:從磁盤讀取的過程
內存: 沒有額外內存占用
性能:從磁盤讀取的過程
內存:沒有額外內存占用
性能:從磁盤讀取的過程
LoadFromMemory (異步)加載  內存:未壓縮的資源包大小
性能:沒有額外的處理過程
內存:LZ4高壓縮資源包的大小
性能:沒有額外的處理過程
內存:沒有額外內存占用
性能:從磁盤讀取的過程
LoadFromFile(異步)加載 內存:沒有額外內存占用
性能:從磁盤讀取的過程
內存:沒有額外內存占用
性能:從磁盤讀取的過程
內存:LZ4壓縮包的大小
性能:從磁盤讀取+LZMA解壓+LZ4壓縮 的過程
WebRequest (也需要緩存)加載  內存:未壓縮的資源包大小
性能:沒有額外處理過程[+如果緩存則從磁盤中讀取的過程]
 內存:LZ4高壓縮包的大小
性能:沒有額外處理過程[+如果緩存則從磁盤中讀取的過程]
內存:LZ4壓縮包的大小
性能:當下載的時候,LZMA解壓過程+LZ4壓縮過程[+如果緩存則從磁盤中讀取的過程]


*當使用WWW方式下載資源包的時候,WebRequest還有一個8*64kb的疊加緩存用來保存來自Socket的數據

 

總結——在游戲里使用低級加載的API時,有以下建議:

1、把資源包部署在StreamingAssets中——用BuildAssetBundleOptions.ChunkBasedCompression方式打包並用AssetBundle.LoadFromFileAsync來加載它,這提供了數據壓縮和最快加載的性能,並且內存開銷等於讀取緩沖器。
2、下載資源包時,使用默認的打包選項(LZMA壓縮),並且用LoadFromCacheOrDownload/WebRequest來下載和緩存它。這樣為了進一步加載,會有最好的壓縮比和AssetBundle.LoadFromFile加載性能。
3、加密包——使用BuildAssetBundleOptions.ChunkBasedCompression選項打包,並且用LoadFromMemoryAsync加載。(這基本是唯一使用LoadFromMemoryAsync加載的情況)
4、自定義壓縮——使用BuildAssetBundleOptions.UncompressedAssetBundle選項來打包,並且在用自定義的壓縮方式解壓資源包后,使用AssetBundle.LoadFromFileAsync來加載
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM