最近突然想到个问题。
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 |
8 | AB.LoadAsset a并且实例化a | 实例化a |
9 | 确认a上面的bc引用存在 | 确认a上面bc引用丢失 |
步骤 | 测试3 | 测试4 |
---|---|---|
1 | 加载a | 加载a 并且 LoadAsset a |
2 | 实例化a | 实例化a |
3 | AB.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 |
4 | AB.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 |
10 | AB.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 神一般的狄狄