3.6.2使用assetManager.bundle 来load过某个文件后 下次再load会去直接get吗

  • Creator 版本:3.6.2

  • 目标平台: iOS / Android

  • 重现方式:

  • 首个报错:

  • 之前哪个版本是正常的:

  • 手机型号:

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率:

  • 例如我这样加了一个文件是art/test/3004
let bundle = assetManager.bundles.get(args.bundle);
bundle.load("art/test/3004", SpriteAtlas, args.onProgress, args.onComplete);

下次我再像上面这样去load同样的文件的时候, 引擎会直接使用bundle.get("art/test/3004", SpriteAtlas) 来获取文件吗?

每次都使用load来加载文件会有性能问题吗 会有内存问题吗?

哪位打包测试下就知道了,我也想看看,反正之前是发生过 load 后再次 load 都要 30-50ms 的时间(3.3.2)

我翻了一下源码 貌似每次load都是会开启一个异步任务…

3.6.2昨天我这边用预制体大概调过几次,除第一次是30ms,后面都是1-3ms左右.但是如果自己做个加载缓存,加载之后获取的速度在0.001-0.008ms左右

这么说加载过后的文件引擎应该是有缓存的

第一次加载之后,会把资源对象信息缓存到 AssetManager 的 map 中,下次再加载相同 url 或 uuid 的资源时去获取这些已经缓存的资源对象。

好的感谢解答

还是使用 bundle.get 吧 时间0.0几毫秒
bundle.load 第二次要好几毫秒

这里的差异极大

资源释放后,是不是要重新load。假设我有两个界面A,B的预制体,打开A后,A中代码有很多异步加载的资源。然后再打开B,这时候要等A的异步加载完才加载B的,要等很久,这怎么解决呢?
1、设置加载优先级,还有其它吗?能彻底解决的

释放了需要重新加载。

你可以先试试预加载预制体依赖的资源,预加载只会从包体或者网络中获取你的资源,但是不会进行解析,能帮你优化掉资源获取阶段的开销。
如果预加载之后,你的加载情况还是卡顿,那么就是资源解析或者节点添加这两个阶段卡顿。
资源层面:散图使用自动图集合并,自动图集选择图片压缩
资源解析层面的优化一般可以使用 bitmapfont 替换系统字体、音频资源降低声道、spine 改用二进制格式骨骼数据、使用 base64 的 imageData 储存纹理数据的 2D 粒子改用贴图资源作为纹理、
节点层面的优化一般可以使用虚拟列表、节点池、预生成节点之后销毁

预加载的资源,占用的是本地内存不是运行内存这个意思是吗?
那么我并不清楚用户的操作,比如一个界面有多个按钮,打开对应的多个界面,我要把所有的对应界面的资源都预加载嘛?

最简单的做法就是在游戏进入大厅时在加载进度读条阶段预加载(这个阶段不需要把所有资源都加载,加载一些二级界面就行)。预加载也有进度可以查询,所以也可以把它的进度加到这个阶段。

另外就是一些比较深层次的多级界面,可以在打开大厅之后,在游戏中偷偷加载。因为预加载和普通加载并不会干扰。进行普通加载时如果预加载也在进行,那么已经完成预加载的资源也会被使用,同样能加速加载。

预加载不需要释放吗?我理解中的预加载意思是,在打开某界面前提前加载,但是界面关闭后资源释放了,下次打开也是要预加载。

加载和释放是对应的操作,只要你确定已经不会再加载相同类型的资源了,那么就释放吧。释放之后引擎里就没有这个资源对象的缓存了。也就意味着下次加载也会变慢(通过网络获取的资源不会被删除,所以这部分资源的获取速度不会变慢)。