正确处理平铺地图或精灵中的纹理

时间:2012-02-13 18:07:20

标签: objective-c performance cocos2d-iphone

我不确定如何完全杀死在cocos2d-iphone中使用图形的节点。

那究竟是什么意思?好吧,例如,我有一个CCTMXTiledMap。它使用了一些纹理,对吧?好吧,我不再需要使用这个平铺的地图,所以我杀了它,并且我认为这样的纹理也被杀死了,内存被释放了。

我正在使用[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];获取有关当前在内存中保存的纹理的信息。

    CCTMXTiledMap *map = [CCTMXTiledMap tiledMapWithTMXFile:@"myMap.tmx"];
    [self addChild:map z:0];
    [[CCTextureCache sharedTextureCache]
                             dumpCachedTextureInfo]; // I get 32MB usage.
    [self removeChild:map cleanup:YES]; // I assume this will "kill" the map.
    [[CCTextureCache sharedTextureCache]
                             dumpCachedTextureInfo]; // I STILL get 32MB usage

正如您所看到的,从儿童中删除地图似乎并没有真正杀死它所使用的纹理。

我应该如何释放记忆呢?我认为CCSprites等也是如此。根据CCTextureCache,我只是继续堆叠内存直到我的应用崩溃。

注意:我知道我可以使用类似[[CCTextureCache sharedTextureCache] removeAllTextures];的内容并清理所有内容。但这似乎并不高效。

1 个答案:

答案 0 :(得分:1)

CCTextureCache只会删除存在 NO 引用的纹理。我自己没有使用过CTMXTileMap类,但也许那里有引用纹理的对象。 CCSpriteBatchNode也是如此。您必须首先从缓存中删除spriteFrames,然后删除removeUnusedTextures,此时将回收内存。建议您在删除地图后使用removeUnusedTextures

我在CTMXTileMap中没有看到明确的清理,它依赖于dealloc来删除可能引用纹理的对象。也许(不确定),在重新测量之前,你应该给自动释放池一个机会最终释放地图。