1玻佩、Hash
使用BuildPipeline.BuildAssetBundles(targetPath, Options, BuildTarget); 生成AssetBundle時(shí),可以將Options參數(shù)添加BuildAssetBundleOptions.AppendHashToAssetBundleName選項(xiàng)此迅,這樣生成的Bundle名字都會(huì)帶一個(gè)Hash炕桨。這樣便于熱更新萧落,當(dāng)資源內(nèi)容改變而名字本身不會(huì)變化時(shí)溺欧,通過(guò)Hash值的差異就可以比較出是新資源還是舊資源了股毫。但在實(shí)際操作中卻遇到了資源有變化但生成的Hash碼卻未變的情況,后網(wǎng)上一查困介,才知Unity的Hash算法只是個(gè)偽hash算法大审,相當(dāng)不靠譜。后來(lái)我們生成Bundle后又對(duì)Bundle的名字加了CRC校驗(yàn)碼座哩,確保資源變化后名字一定又變化徒扶。
2、CRC校驗(yàn)
通過(guò)BuildPipeline.GetCRCForAssetBundle(string targetPath,out uint crc)接口可以獲取某個(gè)Bundle的CRC值根穷。使用UnityWebRequestAssetBundle.GetAssetBundle(string uri,CahcedAssetBundle cachedAssetBundle,uint crc = 0u)下載Bundle時(shí)可以設(shè)置是否進(jìn)行crc校驗(yàn)姜骡,crc默認(rèn)為0,即不進(jìn)行crc校驗(yàn)屿良,非零則拿傳入的值對(duì)下載下來(lái)的Bundle進(jìn)行crc校驗(yàn)圈澈,校驗(yàn)不對(duì)則返回錯(cuò)誤。
3尘惧、Caching
Caching類用來(lái)管理AssetBundles緩存,Unity可以創(chuàng)建多個(gè)緩存Cache康栈。Caching.GetAllCachePaths(pathes)獲取所有緩存路徑。Caching.AddCache(string cachePath)可以添加新的Cache喷橙。Caching.currentCacheForWriting設(shè)置當(dāng)前緩存路徑啥么。當(dāng)設(shè)置了該屬性時(shí),使用UnityWebRequestAssetBundle下載的AssetBundle就會(huì)存儲(chǔ)到這個(gè)緩存路徑中贰逾。
每個(gè)Cache都有一個(gè)maximumAvailableStorageSpace屬性悬荣,即當(dāng)前緩存最大可用存儲(chǔ)空間,該值默認(rèn)為4G似踱,expirationDelay屬性即最大緩存時(shí)間隅熙,默認(rèn)為150days。我們可以使用Application.persistentDataPath作為緩存路徑存儲(chǔ)熱更新的資源核芽,這樣資源就不會(huì)過(guò)期清除了。
4酵熙、壓縮格式
(1)LZ4:基于塊的壓縮方式轧简,壓縮比相對(duì)LZMA要差,但是加載時(shí)內(nèi)存開銷和時(shí)間開銷更小匾二。當(dāng)需要從Bundle中加載一個(gè)Asset時(shí)哮独,只需要解壓Bundle中該Asset所在的chunk,其它塊還是以壓縮格式存在緩存中察藐。
打包AssetBundle時(shí)使用BuildAssetBundleOptions.ChunkBasedCompression選項(xiàng)
(2)LZMA:Unity默認(rèn)Bundle壓縮格式皮璧,壓縮比高,但是加載時(shí)會(huì)將整個(gè)Bundle解壓分飞,所以加載內(nèi)存開銷和時(shí)間開銷都較大悴务。