【Unity優化】資源管理系列04:AssetBundle 使用細節

綜述

1)一個AB經過 LoadFromFile 被加載時,只有頭信息被加載到內存,所以只佔用幾千字節。可是若是須要加載大量AB,則會產生必定影響。算法

2)管理AB及其資源,最重要的是要理解 AssetBundle.Unload 使用 true 仍是 false 參數,以及什麼時候調用。緩存

① Unload(False):只卸載頭信息;不卸載從AB中複製實例化的資源對象網絡

② Unload(Ture):頭信息、從AB中複製實例化的資源對象全都卸載gradle

Unload(Ture) 細節

1)錯誤使用:報資源丟失錯誤ui

2)兩種使用方式:對象

① 在適當時機,好比 loading 時,卸載全部 AB遊戲

② 管理AB中每一個資源對象,進行引用計數,當AB中全部資源都不被引用時,卸載該AB內存

Unload(False)細節

1)錯誤使用:致使內存中出現重複資源;資源

2)兩種方法卸載已加載進內存的資源:開發

① 移除對資源的全部引用,而後調用 Resources.UnloadUnusedAssets

② non-additively 地加載場景,Unity自動清除舊場景內全部資源對象,並調用 UnloadUnusedAssets

卸載方案

1)在相似 loading 這樣的時機,卸載舊資源,加載新資源

2)最簡單的方式,是以場景爲單位打包資源,加載新場景時卸載整個舊場景

3)將須要同時加載的資源,打進同一個AB

分發AB

1)隨遊戲一塊兒安裝:通常主機、PC遊戲採用

① 不須要更新的AB

② 要更新的AB的初始版本

2)遊戲安裝後,從網絡下載更新:移動遊戲採用

① 減少初始包體

下載AB細節

1)若是AB是LZMA壓縮,則被解壓緩存在內存,或再被壓縮爲LZ4格式

2)若是AB是LZ4格式,則不作其餘處理,直接緩存在內存

3)若是緩存已滿,則刪除最遠未使用的AB

內置AB緩存細節

1)經過 UnityWebRequest 下載的AB,被存在Unity內置AB緩存中

2)UnityWebRequest 的 GetAssetBundle 方法時,可傳入 Version 參數。須要說明,該參數不包含在AB中,也不禁AB系統生成,而是遊戲每次第一次加載AB時開發自行設置,也可以使用 manifest 文件中的 CRC 做爲 version(可是不要使用AssetBundleManifest.GetAssetBundleHash(),由於不是真的hash算法)。

3)若是 version 參數與緩存中同名AB相同,則加載緩存中AB;若是不一樣,則下載更新。

4)AB緩存系統僅經過文件名識別是不是同一個AB,而不是經過URI。所以能夠先從StreamingAssets加載AB,再經過 UnityWebRequest 下載AB,此時路徑能夠不一樣。

5)若是想要更細粒度的控制權,可從 Caching 提供的多個緩存中選擇須要的緩存。用於備份或降級備用,好比同時緩存低清和高清資源。

6)Caching.expirationDelay:若是AB在N秒內沒有被引用,則自動從緩存刪除

7)Caching.maximumAvailableDiskSpace:若是超過空間,則刪除最遠使用的AB

Streaming Assets 細節

1)任何類型資源均可以放入StreamingAssets

2)編譯打包時,StreamingAssets內資源被複制進入最終包

3)在運行時,可經過 Application.streamingAssetsPath 獲取 StreamingAssets 路徑

4)安卓相關:

① StreamingAssets存儲在APK中,壓縮算法取決於Unity版本,可經過解壓APK查看是否被壓縮。若是StreamingAssets被壓縮,則 AssetBundle.LoadFromFile() 會比較慢;也可使用 UnityWebRequest.GetAssetBundle() 將資源解壓並緩存,代價是增長內存佔用。

② 可將項目導出爲 Gradle 項目,在打包時添加AB相關擴展,而後編輯 build.gradle 文件,將AB擴展設置爲 noCompress。以後再使用 AssetBundle.LoadFromFile() 加載AB,就不須要解壓縮。

5)在有些平臺,StreamingAssets不可寫,此時可用 WWW.LoadFromCacheOrDownload 或自制下載器。

須要自制下載器的情形

1)對AB緩存須要更細粒度的控制

2)須要實現定製壓縮策略

3)須要針對特定平臺實現特定需求,好比要使用 iOS 後臺下載API

4)AB必須使用SSL協議分發,好比PC平臺,Unity沒有提供很好的SSL支持

相關文章
相關標籤/搜索