CocosCreator的内存释放,呵呵🙄

公司的项目,做热更新打包查找(prefab和场景)依赖的时候发现内存异常,明明已经调用了cc.loader.release/cc.loader.releaseAsset/cc.loader.releaseAll和cc.sys.garbageCollect,内存还是没有下降,随着查找的资源越来越多,占用的内存快要把物理内存撑爆了……
于是断点了一下,看到了这样一段数据……


背景说明:在项目中做了一个场景,通过Simulator调用外部传进来的数据(uuid)加载对应的资源(prefab、场景)然后通过cc.loader.getDependsRecursively获取依赖,然后释放对应的资源,然后,内存就爆了……

5赞

围观围观,顺带问一下,是1.9.x吗?我们的项目用的也是这个版本

把creator版本号贴一下
@jare

围观 围观

版本号和demo提供一下谢谢。

1.9.3:joy:

想问一下,释放场景是不是只有一个方法,就是切换场景?如果是通过cc.loader.load加载的场景,就无法释放了?

你指的应该是释放场景依赖的资源吧?场景中通过 cc.loader.load 加载资源通过 cc.loader.release 释放,其余的则在场景销毁后自动释放。
你阅读这个文档应该就明白了。
https://docs.cocos.com/creator/manual/zh/asset-workflow/scene-managing.html?h=释放

通过 cc.loader.release 释放资源这个是知道的,但是我们想要获取的不仅仅是prefab的依赖,我们还想获取某些指定场景的依赖,所以通过cc.loader.load加载了场景(cc.SceneAsset)而不是cc.Prefab,成功地获取到了所有的依赖,但是无法释放cc.SceneAsset,最终导致内存暴涨

建议你将场景资源的自动释放参数设置为 true,

,开启自动释放功能。
这能让场景自动释放静态依赖资源。

好的,我试一下

我试了一下,已经把项目里面所有的场景的autoReleaseAssets设为true了,然而内存还是没有释放,我通过cc.loader.load以uuid加载cc.SceneAsset,通过cc.loader.release来释放资源,同样的操作对cc.Prefab支持就很好,但是对cc.SceneAsset就没有效果。

通过 cc.laoder 加载之后的场景,再通过 cc.director加载场景,之后你是在哪个时机释放资源的?
因为场景本身在不用的时候是会自己释放资源的。
那么问题应该明确一下
1、你这里是说cc.SceneAsset资源无法正确释放
2、还是说场景加载之后资源无法正确释放。

没有通过cc.director加载场景,所以我在想,是不是cc.loader.load加载场景的时候就把场景放到了某一个缓存中,后面cc.loader.release的时候并没有从缓存中删除,所以释放失败。
cc.loader.load({ uuid, type: “cc.SceneAsset” }, (error: any, asset: cc.Asset) => {
if (!error) {
const depends = cc.loader.getDependsRecursively(asset);
// …
cc.loader.release(asset);
cc.sys.garbageCollect();
}
});

如果你没有加载scene资源,scene资源也不会产生资源引用,它只会被缓存到cc.loader._cache中。
首先你可以在

cc.loader.release(asset);

的下一帧通过cc.isValid(asset)输出看下资源对象是否被销毁。

或者输出 cc.loader._cache看下缓存是否清除。

如果以上都显示销毁或清除,表示已经释放。

我已经获得了所有的scene的引用,所以从你的论述来看,我应该是已经加载了,我甚至尝试过destroyImmediately来销毁,但是资源依旧占用内存。

这是个重要问题,眼。

我看了一下cc.loader._cache的记录,缓存已经被清除了,但是内存并没有降低。

之所以确定是cc.SceneAsset的问题,是因为,我们的项目中存在很多类型的资源的依赖需要检索,包括但不限于cc.Prefab/cc.SceneAsset/cc.AudioClip/cc.SpriteFrame,发现内存暴涨之后,我尝试在代码中加入了跳过cc.SceneAsset的逻辑,然后内存就正常了,这只是为了找到问题所在,我们实际是需要处理cc.SceneAsset的。

嗯,我目前困扰与没能很好的复现你的内存不降的问题,非常希望你能提供一个demo给我。