2

我有一个不是单例实例的 GameScene 类。因此,每次用户选择新关卡时,我都会分配和取消分配它,并将“静态”/“共享”数据保存在不同的单例类(例如 GameManager)中。

我正在使用ARC。我想了解在内存管理的角度下我的方法是否正确。换句话说,在清理时调用“removeUnusedSpriteFrames”就足够了吗?这会删除 game-art-forLevelOne-hd.plist 中的所有精灵吗?我也应该对 CCSpriteBatchNode 做点什么吗?

-(void) loadGameArtFileForLevelOne  //I do this in a switch but this is to simplify the reading 
{
    CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
    [frameCache addSpriteFramesWithFile:@"game-art-forLevelOne-hd.plist"];
    CCSpriteBatchNode * sharedSpriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"game-art-forLevelOne-hd.png"];    
 }

//As dealloc is deprecated for ARC code, I prefer to remove unused sprites and texture on cleanup
-(void) cleanup
{
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];     
}

我在 CCSpriteBatch 节点的 dealloc 方法中添加了一个 CCLOG 调用。当我加载 GameScene 然后返回菜单时,我按预期看到了“删除未使用的纹理”的日志,但我没有看到 CCSpriteFrameCache 的 dealloc 方法的任何日志。* !! 警告:请参阅下面的编辑 - 我的错误!*

编辑:对不起,我的意思是我没有看到 CCSpriteBatch 的 dealloc 方法的任何日志

这让我有点担心,因为我想“释放”并删除与关卡精灵相关的所有内存。

一旦我理解了这一点,我就会“优化”这一点(例如,每个级别都有一个精灵表 - 例如世界 1 - 并且每个背景都有一个精灵表)。

有什么建议吗?

4

2 回答 2

4

你可以用这个..

 [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];

如果您需要更多,请使用关注。

[[CCDirector sharedDirector] purgeCachedData];
[[CCTextureCache sharedTextureCache] removeAllTextures];
[CCTextureCache purgeSharedTextureCache];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
于 2012-09-17T09:39:13.610 回答
1

编辑:

我假设您正在CCSpriteBatchNode某处添加节点,尽管您发布的代码没有显示它(您还提到,它发生在开关中,所以我认为在完全不同的设置中)。如果是这样,它不会被释放,直到您从添加它的位置删除它。

在这里,也许需要澄清一下。

CCSpriteFrameCache是一个缓存:一个存储所有精灵的存储空间,以便随时可以重用。

CCSpriteBatchNode是一种在 Open GL 层中提高性能的机制,原则上与缓存完全无关。

我了解,如果您通过批处理节点使用的某些精灵仍然存在于某些层/节点/场景中,则它不会被视为“未使用”并且不会被您的清理代码删除。实际上,它正在使用中。当您从所有引用它的节点中删除它时,缓存的精灵将变为“未使用”。

至于你的问题:

换句话说,在清理时调用“removeUnusedSpriteFrames”就足够了吗?

好吧,我认为这取决于你的应用程序什么可以被认为是好的清理。从缓存中删除未使用的精灵当然可以;但你也可以做其他事情:卸载你加载的音频资源;删除场景中未使用的部分(如果需要,可以重新加载);等等

希望这可以帮助。

我没有看到 CCSpriteFrameCache 的 dealloc 方法的任何日志。

CCSpriteFrameCache是一个单例,所以它应该存在于程序的整个生命周期中(它可能会有所不同,但我敢打赌就是这种情况):

 CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];

所以,我不会担心缓存没有被删除;重要的是它的内容被清空了。

于 2012-09-17T09:02:57.773 回答