Addressable – 有关热更新
标题Patch的不同操作
- Default Build Script:
- 首次资源打包,使用Default Build Script。那么当前的Addressable的一些资源数据会存储到addressable_content_state.bin文件中,这个文件是存在包体中的。如果后续使用new build的时候,使用老包的用户是没有办法获得这些更新数据的,就会出现加载不到新的资源的现象
- Update a Previous Build操作的原理
- 任何已更改的本地资产将永远不会在用户的设备上使用。
- 如果用户已经缓存了一个nonstatic非静态包,那么他们将需要重新下载该包,包括未更改的资产(例如,在这个实例中,AssetY 和 AssetZ)。 理想情况下,用户没有缓存包,在这种情况下,他们只需要下载新的 Remote nonstatic 包。
- 如果用户已经缓存了 Remote Static远程静态包,那么他们只需要下载更新的资产(在这个实例中,是content update group中的AssetL )。 在这种情况下,这是理想的。 如果用户没有缓存该捆绑包,他们必须通过content update group下载新 AssetL,以及通过未触及的 Remote static 捆绑包下载现已失效的 AssetL。 无论初始缓存状态如何,在某个时刻,用户的设备上都会有不存在的 AssetL,尽管它从未被访问过,但它会无限期地缓存下去(old 的 L 包会一直存在)
区分catalog 和 Addressables_content_state.bin 文件作用
- Catalog 作用:资源表,对应addressable的所有资源。主要是做检查boundle的更新
- 游戏在用Addressable加载资源的时候会根据资源地址检测资源在哪个bundle,然后看看当前bundle是否存在,不存在就上网下,然后检查bundle自身的hash直和catalogs里的是否一致,一致就直接读取本地资源,不一致就上网下,下不到就报错,你有老资源也不会读取。它只认资源表
- 当你打开build remote catalogs,就支持了网络更新资源表
- 不打开build remote catalogs, 可以下网络的资源但是不能热更,这里说的是出包的之后,就只能通过本地的catalogs下载固定的资源,并且下的时候还会校对hash,crc,你替换资源也没用,尝试关闭hash,crc会出错。所以不用想着用addressable系统去更新资源表里没有的资源了,要想那么做,只能另外用assetbundle
- 如果你不激活disable catalog update on startup,那么每当你第一次初始化Addressable. InitializeAsync 的时候,(如果你不调用 InitalizeAsync,那你用Addressable的任意功能依然都会自动初始化)会自动上网拉取资源表,如果你关闭自动拉取,那么你得用CheckForCatalogUpdates和UpdateCatalogs去主动下载资源表。
- Addressables_content_state.bin :文件包含Addressables系统中每个StaticContent资源组的哈希和依赖项信息。
资源释放
- Resources.UnloadUnusedAssets : 会释放Addressable中没有引用的资源
- Addressables.Release : 减少当前的资源的引用计数,当这个引用计数为0的时候,才会释放当前的资源
欢迎一起讨论哦😯
QQ群 :665343902