首页 > 代码库 > cocos2d-x3.2 内存管理

cocos2d-x3.2 内存管理

        图片缓存没去掉,这游戏里面普遍的问题。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()的处理

cocos2d-x3.2 内存管理