2.4.4资源预加载无法释放,存在于files中但是不存在于assets @EndEvil

最近做内存管理的优化。发现在做了一套弹窗资源的引用计数之后,游戏内还会出现内存过高导致gc卡顿的问题。

怀疑是bundle.preload 的资源 无法释放导致的。

看了一下具体的逻辑,发现只会在 load 和 factory.create 中才会将资源放入 assets 中。对于preload预加载的资源,只会存在于 files 里面。 这样的话,哪怕我调用cc.assetManager.releaseUnusedAssets(),由于在
assets 没有,资源也无法释放。

请问这是不是一个bug,我该如何处理?

测试代码如下Test.rar (1.3 KB)

@EndEvil 麻烦看下
有个类似的帖子

preload 只是下载资源,并不是将资源加载到内存中
这个我和引擎组的大佬们确认过
不在内存的的话,自然也就无法释放

不,会存在的,只是没有执行parse。执行完fetch后,执行了download,下载的资源会存放在files中,只有执行完parese后,才会存放在assets中。
比如一个png图片,在download之后,去downloadFile 文件,得到回复之后,将数据存储在files中。但是没有执行 parseImage 的过程。 预加载实际上就是省略了 createImageBitmap 这个过程。
但是 files中 还是会有的。

现在的问题是 如何释放这个files。下面是我刚改的,但是有些不确定

1赞

确实 ,我刚看里面的数据,也不多才对

有道理,应该并一定是过高导致的。我刚发现进入主界面后就发生了一次gc。但是很奇怪,微信性能数据显示才186m,为什么微信会触发wx.onMemoryWarning 内存警告呢? 我在收到这个的时候,执行了一次gc

发现性能数据也不准,后面又到5-6百兆了

有些 JSON 应该会缓存,大部分图像等资源只是下载了,files 里面只是存了个 url

那是否有释放的必要呢?

你那边预加载后保证会调用 load 么,files 会在资源被真正被加载的时候清除掉

不一定会调用,预加载会有很多的队列,如果玩家点击了之后,才会去load,而我资源管理的释放,是在prefab销毁的时候做的,所以感觉这边可能会有问题

files 是一个 Cache,里边用来就下载过的资源,防止多次下载
里边只会记录一些资源的信息吧,这点数据,都能影响到gc的话·····我没遇见过哎
我有个疑问请教下哈,内存过高会导致gc卡顿么? gc只是回收垃圾吧,也就是说,是频繁释放了什么引起的吧

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。