天天看點

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

綜述

1)一個AB通過 LoadFromFile 被加載時,隻有頭資訊被加載到記憶體,是以隻占用幾千位元組。但是如果需要加載大量AB,則會産生一定影響。

2)管理AB及其資源,最重要的是要了解 AssetBundle.Unload 使用 true 還是 false 參數,以及何時調用。

① Unload(False):隻解除安裝頭資訊;不解除安裝從AB中複制執行個體化的資源對象

② Unload(Ture):頭資訊、從AB中複制執行個體化的資源對象全都解除安裝

Unload(Ture) 細節

1)錯誤使用:報資源丢失錯誤

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支援

繼續閱讀