基础相关
1、什么是AssetBundle
AssetBundle包含一个Header和一个数据段
Header在构建AssetBundle时创建。包含识别符,压缩标志,清单(由名字为索引的查找表格)一般为平衡树查找或者红黑树查找。会随着资产数量增加而增加构建AssetBundle时间成本。
2、当资源A没有被分配到ab包中,任何引用资源A的ab包都将会产生一份资源A的拷贝,这会使包体变大、产生冗余。并且ab包都被加载到内存中里。将会有多份资源A
3、图集中Sprite分布在多个ab包中,那么每个ab包中都会拥有一个图集信息(这个还挺大)
加载
- 1、
AssetBundle.LoadFromMemory(Async)
官方不建议使用,内存消耗大,将在内存中冗余三次:一次在托管代码字节数组中,一次在AssetBundle的栈内存副本中,第三次在GPU或系统内存中,用于Asset本身。 - 2、
AssetBundle.LoadFromFile(Async)
这个api只加载ab包头部信息,剩下的在磁盘中,按需加载(调用AssetBundle.Load或者Instance ID被间接调用),这种只支持LZ4压缩格式和无压缩的,但是对于Editor下会加载全部
压缩格式:
– LZMA:对所有Asset序列化后的字节进行压缩,所以这个api无法直接获取到头部信息,只能等加载完才能获取到
– LZ4:对单个Asset序列化后进行压缩
– 无压缩 - 3、
AssetBundleDownloadHandler
– 最简单方法是调用UnityWebRequest.GetAssetBundle
– DownloadHandlerAssetBundle这个也可以,好像更好用,用到再查
从AB包中获得Asset
- 1、
LoadAsset (LoadAssetAsync)
- 2、
LoadAllAssets (LoadAllAssetsAsync)
加载多个独立Object时,使用时机加载ab包中大部分对象或者全部对象时使用,因为这个比多个LoadAsset快,如果加载ab包中的数量较大却又没有达到ab包的三分之二。那么可以将这个ab包拆分为多个ab包然后调用LoadAllAssets - 3、
LoadAssetWithSubAssets (LoadAssetWithSubAssetsAsync)
加载的对象全部来自一个asset和许多没有关系的asset存储在一块
AssetBundle 依赖项
- 1、
加载API:
– UnityEditor中,可以通过AssetDatabaseAPI查询AssetBundle依赖项。
– AssetBundles分配和依赖项可以通过AssetImportAPI访问和更改。
– 在运行时,Unity提供了一个可选的API,通过基于ScriptableObject的AssetBundleManifest API加载在AssetBundle构建过程中生成的依赖信息。
-2、注意: 存在依赖中ab包的加载时没有顺序的,但是asset的加载是有顺序的
– 假设material A引用texture B。material A被打包到AssetBundle1中,texture B被打包到AssetBundle2中,这并不意味着AssetBundle 2必须在AssetBundle 1之前加载,或者texture B必须从AssetBundle 2中显式加载。在将material A从AssetBundle 1加载之前加载AssetBundle 2就足够了。