资源基础学习记录(一) AssetBundles

基础相关

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就足够了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值