Cocos2dx - 清除缓存中的特定纹理

时间:2014-08-05 19:24:20

标签: c++ cocos2d-x cocos2d-x-2.x

由于“内存压力”,我在iPhone 4上崩溃了。我的游戏设置如下:

  1. 主场景精灵表始终保留在内存中。
  2. 单个游戏场景级别从单个纹理(不是精灵表)加载。
  3. 当一个关卡完成并返回主场景时,我希望这些缓存的游戏场景纹理被转储。最终发生的事情是当你玩3-4级时,它会因内存耗尽而崩溃,因为它在一个级别之后永远不会释放这个内存。我不希望在游戏场景的生命周期中缓存关卡纹理。返回主场景时,需要释放此内存。

    我已经尝试删除所有对记忆没有任何作用的游戏场景。我试图寻找一种特定的方法来清除我从缓存中加载到这个游戏场景中的这些纹理。

    有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您使用的是cocos2d v2吗?您可能有内存泄漏,因为必要时会删除未使用的纹理。尝试分析您的应用,看看您是否有泄漏以及他们在哪里。

您也可以在适当的时候自己调用这些方法,但我怀疑您是否必须:

[[CCTextureCache sharedTextureCache] removeUnusedTextures];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];

但你所描述的内容听起来更像是内存泄漏。当您的应用程序收到内存警告时,将清除缓存的数据。在此清除过程中,除了其他内容之外,还会在纹理缓存上调用remove unused texture方法。如果您在退出这些场景后很长时间内仍然存在3/4级别的数据,那听起来就像是内存泄漏。

我认为只有在访问多个场景后才会发生这种情况,问题不在于您的第四个场景只是尝试加载的数据超出设备可以处理的数量。

答案 1 :(得分:1)

您可以删除调用的特定纹理:

在cocos2D-x v3.x中:

Director::getInstance()->getTextureCache()->removeTextureForKey(ImageKeyName)

在cocos2D-x v2.x中:

CCTextureCache::sharedTextureCache()->removeTextureForKey(ImageKeyName);

其中ImageKeyName只是图像的路径(与用于加载纹理的路径相同)