使用的版本是3.6版本,反复的切换场景,并且每次切换场景会清理纹理资源,运行一段时间后内存直接暴涨,释放的很少,
有遇到同样问题的吗?求解决方案啊?难道是闭包引起的释放不掉对象原因吗?急求解答啊
你最好中间弄一个过度场景,在过度场景中调用释放函数,保证引用数目为0了之后再释放,这样才能释放,释放不仅要释放散图,还要释放SpriteFrame和Animation,具体的是这三个函数,cc.AnimationCache.destroyInstance();cc.spriteFrameCache.removeUnusedSpriteFrames();
cc.textureCache.removeUnusedTextures();.而且一般来说已经有的资源是不会再加载的,你的内存占用会达到一个上限。你可以用cc.textureCache.getCachedTextureInfo()查看图片的内存引用,
我感觉现在的问题不是纹理没有释放,是有JS对象没有释放,我很多地方直接为node自定义了很多属性和方法,当node被清理的时候,自定义的很多属性变量会被清理么?
一般来说js对象占用内存是很小的,大头还是资源.如果你能保证图片资源都释放正常,一般的js对象你无需管理他的生命周期。一个js对象没有被任何指针引用的时候,gc会适时的清理他。
我这有同样的问题,感觉是js的内存管理问题。程序完全不新new Ref的情况下(在 Ref的构造函数内增加了断点),内存依然每秒增加500k左右,直到某一个值后停止。通过mac的内存检测工具可以检查一定量的内存泄露,但是与实际内存增长量不符。内存泄露检测的量有8MB左右,最终内存大概会增长50MB左右。在4s的机器上很容易崩溃。
因为项目比较复杂,也不敢十分确定,找了几天,已经彻底没有思路了。
怀疑有一些js的匿名函数对象没有进行释放,提交了issue:https://github.com/cocos2d/cocos2d-x/issues/16291
但是issue中的示例代码与我项目代码不符合,实际中并没有那么多次的scheduleOnce。
所以,依然没有弄清楚原因。
肯定是纹理没有释放! 而且是动画纹理!
通过 getCachedTextureInfo 取得的纹理size是正确的size吗?如果是正确的话,我们项目纹理应该是得到正确释放了。
而且完全不操作游戏的情况下,我们游戏应该是没有新建的纹理的,这个我还是很确定的,但是内存依然持续增加。
借楼吐槽一句,官方对于github上的issue回复非常的不上心,即使我给出明确的测试代码,最后也不了了之。
开源开源,一个不听取别人意见的开源,真的算开源吗?
看一看github的CHANGELOG:
cocos2d-x-3.12 Jul 06 2016
[HIGHLIGHT] add VR support
管理层在搞什么啊?
你的内存问题解决了么,我也有同样的问题。切换场景后,内存一直增长。
内存暴涨问题解决了,查了好几天才发现是Spine源码有问题,不知道哪里解析Spine骨架的时候加载同一个Attachment调用了两次createTexture然后释放的时候就释放了一下,改了一下,保证纹理的retain次数跟release次数一样,就可以保证正常释放了。现在不崩溃了,但是感觉内存还是有点高,还能够接受能够自动回落的。只要内存不超过内存上限阀值一般是不会被kill掉的
请问能说的详细一点吗?什么版本的cocos2d?我仔细看了一遍没有找到调用两次createTexture的地方。
createTexture的函数的名称是_spAtlasPage_createTexture吧。打断点的话,每个spine调用_spAtlasPage_createTexture的次数与使用png文件的个数相同。
就是page_createTexture那个地方,因为Spine编辑器导出的png是合图,所以创建attachment的时候所使用的png都是同一张纹理,这个时候就会调用多次createTexture,我也不太清楚是我们SPine工程做的不对还是源码有问题,反正那个地方释放的次数跟引用的次数不对等,你可以创建个animation对象然后从scene中移除,再打印一个纹理的内存数据看一下引用计数