在cocos2d中开发记忆力游戏的问题

3
我正在开发一款iPad游戏。当我在iPad上运行游戏并进入下一个场景时,由于内存不足,iPad会自动关闭应用程序。虽然已经使用TexturePacker将图像转换为pvr格式,但是在场景之间切换时仍无法释放内存。
[CCTextureCache sharedTextureCache] removeUnusedTextures];

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];

我正在使用这些代码,但似乎不太够用。

您有什么想法吗?

2个回答

2
请注意:
  1. 使用工具泄漏工具-尝试在同一特定时刻进行快照(例如当您准备运行场景时),然后检查它们之间分配了什么。
  2. 尝试在程序的特定部分打印应用程序使用的内存,以找出内存泄漏的位置。
  3. 尝试找出在删除场景时未调用的dealloc,然后深入探究。
  4. 尝试调用通用函数而不是未使用的函数:

    [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames]; [[CCTextureCache sharedTextureCache] removeAllTextures];


[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames]; [[CCTextureCache sharedTextureCache] removeAllTextures];我正在使用这些代码。如果我犯了错误而没有注意到,请告诉我。还有其他的想法吗? - PedroMeira
1
你也可以尝试将类别添加到 CCTexture2D 中,并重写 init...dealloc 方法来更新静态的 NSMutableArray,然后在设置场景之前打印它。这样你就可以看到是否还有未释放的纹理了。重要提示:将它们作为非保留对象添加到 NSMutableArray 中。 - Tomasz Zabłocki
@TomaszZabłocki : 我个人不知道如何将对象添加到NSMutableArray中而不增加其保留计数。事实上,这是防止纹理无法从缓存中移除的必要步骤。 - YvesLeBorg
1
@YvesLeBorg:你可以使用[yourArray addObject:[NSValue valueWithNonretainedObject:yourObject]]将对象添加到数组中而无需保留它们,然后使用[[yourArray objectAtIndex:index] nonretainedObjectValue]获取它。 - Tomasz Zabłocki
@TomaszZabłocki:啊,有趣。谢谢。 - YvesLeBorg

1

在删除未使用的纹理后,请使用:

[CCAnimationCache purgeSharedAnimationCache];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCDirector sharedDirector] purgeCachedData];

CCLOG(@"%@<applicationDidReceiveMemoryWarning> : after purge", self.class);
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

这将列出仍保留在缓存中的纹理及其消耗的内存量。任何在您期望其被处理时仍然存在的纹理,可能是因为在代码的某个地方(例如添加到数组中)以某种方式保留了它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接