1)一個AB經過 LoadFromFile 被加載時,只有頭信息被加載到內存,所以只佔用幾千字節。可是若是須要加載大量AB,則會產生必定影響。算法
2)管理AB及其資源,最重要的是要理解 AssetBundle.Unload 使用 true 仍是 false 參數,以及什麼時候調用。緩存
① Unload(False):只卸載頭信息;不卸載從AB中複製實例化的資源對象網絡
② Unload(Ture):頭信息、從AB中複製實例化的資源對象全都卸載gradle
1)錯誤使用:報資源丟失錯誤ui
2)兩種使用方式:對象
① 在適當時機,好比 loading 時,卸載全部 AB遊戲
② 管理AB中每一個資源對象,進行引用計數,當AB中全部資源都不被引用時,卸載該AB內存
1)錯誤使用:致使內存中出現重複資源;資源
2)兩種方法卸載已加載進內存的資源:開發
① 移除對資源的全部引用,而後調用 Resources.UnloadUnusedAssets
② non-additively 地加載場景,Unity自動清除舊場景內全部資源對象,並調用 UnloadUnusedAssets
1)在相似 loading 這樣的時機,卸載舊資源,加載新資源
2)最簡單的方式,是以場景爲單位打包資源,加載新場景時卸載整個舊場景
3)將須要同時加載的資源,打進同一個AB
1)隨遊戲一塊兒安裝:通常主機、PC遊戲採用
① 不須要更新的AB
② 要更新的AB的初始版本
2)遊戲安裝後,從網絡下載更新:移動遊戲採用
① 減少初始包體
1)若是AB是LZMA壓縮,則被解壓緩存在內存,或再被壓縮爲LZ4格式
2)若是AB是LZ4格式,則不作其餘處理,直接緩存在內存
3)若是緩存已滿,則刪除最遠未使用的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
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支持