我看了一下cc.loader._cache的记录,缓存已经被清除了,但是内存并没有降低。
之所以确定是cc.SceneAsset的问题,是因为,我们的项目中存在很多类型的资源的依赖需要检索,包括但不限于cc.Prefab/cc.SceneAsset/cc.AudioClip/cc.SpriteFrame,发现内存暴涨之后,我尝试在代码中加入了跳过cc.SceneAsset的逻辑,然后内存就正常了,这只是为了找到问题所在,我们实际是需要处理cc.SceneAsset的。
嗯,我目前困扰与没能很好的复现你的内存不降的问题,非常希望你能提供一个demo给我。
(帖子被作者撤销,如无标记,将在 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的场景。
我用的1.8.2版本也是 自动释放感觉根本没有作用 场景里没有任何逻辑调用cc.loader但是就是没释放 官方文档说的模棱两可的 勾选自动释放后哪些东西会释放 只是释放节点还是所有texture都会被释放 spine和animation依赖的texture也会被释放么
所以是可以释放了么?
你截图里的代码是很老的…… 现在的引擎应该没有这样的错误了。
对,这样子写就可以释放了
你是说最开始的那张截图?那是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。