cocos2dx 内存问题

初次使用cocos2dx开发游戏,由于游戏中需要加载许多图片和骨骼纹理资源,内存压力很大,我在每个场景replaceScene后,在onExit方法中释放掉了此场景中用到的所有对象,但是,随着场景切换的增多,运行所占内存还是慢慢变大,随时有内存过大被crash的可能,我不明白的是,为什么对象都被释放了,内存还是那么大,是不是有什么隐藏的没有被释放掉?求大神们指教,有什么有效的释放降低内存的方法?急切,求教!!拜求

图片缓存没去掉,这游戏里面普遍的问题。TextureCache::removeUnusedTextures这个方法只有在纹理计数为1的时候才会移除内存中缓存的Texture。这里有一个问题要先说一下:当我们创建一个精灵的时候,这张精灵所使用的Texture是会加载到内存中缓存着的。一旦你再次创建一个使用相同纹理的精灵,这个时候如果内存中还存在这张纹理的缓存,就会直接取出,而不用重新创建。当一个精灵创建的时候,在其内部调用addImage方法的时候,把引用计数做了+1处理,此时引用计数为2.当移除这个精灵的时候,引用计数会-1,这个时候引用计数为1。若此时你调用了TextureCache::removeUnusedTextures的方法。那这张纹理将从内存中移除。但是若是像之前说的,有两个精灵同时使用了这张问题,那该纹理的引用计数为3,必须两个精灵都移除后,才能释放内存。

这边还有一点很重的是:只有在removeChild的时候,引用计数才会做-1处理,而cocos的removeChild是没有对其子节点进行remove处理的,也就是说,子节点中对于Texture的引用计数仍在,导致TextureCache::removeUnusedTextures的时候,纹理没办法有效的移除。

所以这里建议的方案是:

1.在移除一个节点之前,先遍历移除其子节点,释放引用计数

2.在层或者场景切换的时候,手动调用TextureCache::removeUnusedTextures方法


PS:在addChild的时候,会把对象放入容器中,而放入时会对其进行retain()的处理;在removeChild的时候,会把对象从容器中移除,会对其进行release()的处理

非常感谢

purgeCachedData与removeUnusedTextures的区别purgeCachedData里面的purgeCachedEntries有什么用

@大仁

你应该有看过函数了,purgeCachedData是清除纹理数据和其他的一些容器数据(如果你使用了Animation数据,最好也清除一下,这个数据是缓存在AnimationCache里面),而removeUnusedTextures只是清除纹理数据。

purgeCachedEntries是清除了文件的引用路径

懂了,谢谢啊,大哥