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