CocosCreator的内存释放,呵呵🙄

(帖子被作者撤销,如无标记,将在 24 小时后被自动删除)

mark一下。

内存释放头疼啊

我尽量给你弄一个Demo吧,资源少了复现不了的

试试加这个,cc.sys.garbageCollect()

早就加了,没用

我尝试在Native代码里面打断点,通过Log判断我开始处理cc.SceneAsset之后,CCScene.cpp代码中的构造函数断点命中了,但是在我处理完了这个场景去处理下一个场景的时候,命中的依然是构造函数,两次构造函数调用之间并没有命中析构函数,且一直到程序运行结束才调用了一次析构函数(应该是我一直在跑的那个场景被释放了)。


整个程序运行的过程中,每一次通过cc.loader.load加载cc.SceneAsset,都会调用Scene的构造函数,但是从来没有调用过析构函数,无论是cc.loader.release/cc.loader.releaseAsset/cc.loader.releaseAll还是scene.destroy/scene.destroyImmediately

另外,根据我的分析,这款引擎在设计的时候,预设了一个前提——有场景加载,就会有场景被替换,所以对于场景的释放,只是在Director中,运行了一个新的场景时,会释放上一个场景,jsb中也只是绑定了场景的创建,并没有绑定关于场景的release,因此这个问题不是说不在js层,而是在于整个引擎的设计,js层和native层都没有对应的设计去释放通过cc.loader.load加载但是并没有通过cc.director去run的场景。

2赞

我用的1.8.2版本也是 自动释放感觉根本没有作用 场景里没有任何逻辑调用cc.loader但是就是没释放 官方文档说的模棱两可的 勾选自动释放后哪些东西会释放 只是释放节点还是所有texture都会被释放 spine和animation依赖的texture也会被释放么

搞定了,不用改Native代码。

……我把release和garbage那一块又挪到外面去了,反正差不多就是这个意思了。

1赞

所以是可以释放了么?

你截图里的代码是很老的…… 现在的引擎应该没有这样的错误了。

对,这样子写就可以释放了

你是说最开始的那张截图?那是1.9.3的,但是我后来发现,这个不是导致通过cc.loader.load加载的cc.SceneAsset无法释放内存的根本原因,根本原因我在上面的回复里面写了。

所以问题出现在 cc.loader 加载的场景上,如果通过 cc.director.preloadScene 或者 loadScene 是不会有内存泄露的,是吗?

可以这么理解,但问题是,我们的需求,是获取这个场景的依赖,而不是加载这个场景,所有的依赖处理逻辑在一个场景中运行,这个场景运行的过程当中会不断地加载大量的包括但不限于cc.Prefab/cc.AudioClip/cc.SpriteFrame/cc.SceneAsset这些类型的资源,在这种情况下,若对cc.SceneAsset使用和cc.Prefab同样的处理逻辑,是不能释放内存的。

可以这么理解,但问题是,我们的需求,是获取这个场景的依赖,而不是加载这个场景,所有的依赖处理逻辑在一个场景中运行,这个场景运行的过程当中会不断地加载大量的包括但不限于cc.Prefab/cc.AudioClip/cc.SpriteFrame/cc.SceneAsset这些类型的资源,在这种情况下,若对cc.SceneAsset使用和cc.Prefab同样的处理逻辑,是不能释放内存的。

引擎之前确实没考虑过直接用 cc.loader 加载场景的情况。因为 API 根本不支持啊?你是怎么加载的?写死 uuid?
另外,为什么不用 cc.director.preloadScene? 这个函数可以获取到 SceneAsset。

uuid是写死的,我们有一个配置表记录了所有的资源。


从引擎的API声明中,实在无法看出cc.director.preloadScene可以获取cc.SceneAsset,即使可以,也依然无法释放,不是吗?
而且我们更期望统一的处理方式。

现在问题已经解决了,我已经找到了可以释放内存的方式。

嗯嗯,你这样写确实是可以释放的。

学习了