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

Cocos2dx - Clearing specific textures from the cache

本文关键字:纹理 清除 缓存 Cocos2dx      更新时间:2023-10-16

我的iPhone 4s因为"内存压力"而崩溃。我的游戏是这样设置的:

  1. 始终留在内存中的主场景精灵表。
  2. 单个游戏场景关卡从单个纹理加载(不是精灵表)。

当关卡完成并返回主场景时,我希望那些缓存的游戏场景纹理能够被丢弃。最终的结果是,当你玩完3-4个关卡时,它会因为内存耗尽而崩溃,因为它不会在关卡后释放这些内存。我不希望关卡纹理在游戏场景的生命周期之后被缓存。当返回到主场景时,它需要释放该内存。

我已经试过删除所有的游戏场景的孩子,不做任何记忆。我试着寻找一种特定的方式来清除这些纹理,我已经从缓存中加载了这个游戏场景。

有什么建议吗?

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

您也可以在适当的时候自己调用这些方法,尽管我怀疑您必须这样做:

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

但是你所描述的听起来更像是内存泄漏。当应用程序收到内存警告时,缓存的数据将被清除。在此清除期间,除去未使用的纹理方法在纹理缓存上被调用。如果在您退出这些场景很久之后仍有3/4级数据潜伏在周围,这听起来像是内存泄漏。

我假设这只发生在访问多个场景之后,问题不在于你的第四个场景只是试图加载更多的数据,而不是设备可以处理。

你可以通过调用

删除特定的纹理

在cocos2D-x v3。x:

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

在cocos2D-x v2。x:

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

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