[一个小测试]Unity的AssetBundle重新引用依赖项,是否可以成功?20200727更新

最近突然想到个问题。
ab加载的策略,能不能加速那。
想着想着 就想到个方案:
如果某个UI的Prefab:a 依赖一个图片:b,a和b都打包成ab.
按照unity的ab相关文章的说法,要加载并显示出a,
需要在a之前加载到b,就很多文章写的 assetbundlemanifest的用法。

所以我就在想, 如果按照顺序 加载b,加载a,然后显示。
这时候a不需要用了,隐藏a,卸载b。
等要用了,在加载b,a会不会直接拿到引用?

如果可以引用,那么在UI部分,将会很好用。
只需要卸载内存容量大的图片,但是UI的结构和控件都保留,那么下次打开的速度将大大增加。。
于是就有了这次测试。

首先是做了个Image的Prefab上面挂了一张图片做显示。
然后把Image拖成prefab,然后这个prefab设置了abname,图片也设置了abname。
可以打包出2个ab+manifest。

然后开始测试。

步骤测试1测试2测试3测试4
1加载图片:ab1
2加载prefab:ab2
3实例化prefab,名字为a
4显示正常
5卸载图片:ab1
6确认a的图片Missing
7加载图片:ab1
8确认a的图片Missing对a.setActive false 后 true重新从ab2里LoadAsset:Prefab卸载prefab:ab2
9-确认a的图片Missing实例化prefab,名字为b加载prefab:ab2
10--确认b的图片Missing实例化prefab,名字为c
11---确认c的图片存在

所以综上测试,AssetBundle的依赖构建 是在ab包通过IO或者下载等操作被加载的时候。
从ab内拿东西,和对scene内的操作,不会影响依赖的构建。
所以ab无法重新构建依赖。
(下面新增了附加测试,原本的测试结果,缺少一些测试步骤 2020 07 27)

如果有大佬有可以重新构建依赖的方法,可以交流一下。
没有依赖,自己做set那种不算哦。


2020 07 27 更新
做了一个新的测试
prefab a;
prefab b;
prefab c;

a依赖 b和c

测试步骤
加载使用接口AssetBundle.LoadFromFile

步骤测试1测试2
1加载a加载a 并且 LoadAsset a
2加载b加载b
3加载c加载c
4卸载b卸载b
5卸载c卸载c
6加载b加载b
7加载c加载c
8AB.LoadAsset a并且实例化a实例化a
9确认a上面的bc引用存在确认a上面bc引用丢失
步骤测试3测试4
1加载a加载a 并且 LoadAsset a
2实例化a实例化a
3AB.LoadAsset a并且确认a上面bc引用丢失确认a上面bc引用丢失
4加载b加载b
5加载c加载c
6确认a上面bc引用出现确认a上面bc引用出现
7卸载b卸载b
8卸载c卸载c
9确认a上面bc引用丢失确认a上面bc引用丢失
步骤测试5测试6
1加载a加载a 并且 LoadAsset a
2加载b加载b
3加载c加载c
4AB.LoadAsset a并且实例化a,确认a上面bc引用存在实例化a,确认a上面bc引用存在
5卸载b卸载b
6卸载c卸载c
7确认a上面bc引用丢失确认a上面bc引用丢失
8加载b加载b
9加载c加载c
10AB.LoadAsset a并且实例化a,确认a上面引用丢失实例化a,确认a上面引用丢失

根据测试(输出了b c的ab的GetInstanceID 加载卸载再加载 得到的ID是不同的)

1
测试1 和 测试2 对比
LoadAsset的时间点,会影响依赖构建
如果认为LoadAsset的时候 会构建内存依赖关系,那么 测试4 和 测试5 的结果就变得非常疑惑了

2
测试3 和 测试4 对比
这一次测试比较疑惑,a的实例化对象已经存在 后 加载依赖资源,但是依赖项被自动关联了
这个就不是很理解了。

3
测试5 和 测试6 对比
没有区别。
可以认为是在实例化的时候 会确认依赖关系?
但是第一次测试的结果却是 在 LoadAsset的时候 构建的依赖关系?

越测试越疑惑, 期待有大神可以疏通一下 构建依赖时候的 逻辑。之后会继续测试。


程序学无止尽。
欢迎大家沟通,有啥不明确的,或者不对的,也可以和我私聊
我的QQ 334524067 神一般的狄狄

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值