【问题标题】:Problems of memory developing games in cocos2dcocos2d开发游戏的内存问题
【发布时间】:2012-11-21 20:14:36
【问题描述】:

我正在为 iPad 开发游戏。当我在 ipad 上运行游戏时,ipad 的骑行场景会因内存不足而自动关闭应用程序。 使用 TexturePacker 将图像转换为 pvr,但从场景到场景无法释放内存。

[CCTextureCache sharedTextureCache] removeUnusedTextures];

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];

我正在使用这些行但还不够。

有什么想法吗?

【问题讨论】:

    标签: objective-c ios cocos2d-iphone


    【解决方案1】:

    请考虑:

    1. 使用仪器泄漏工具 - 尝试在同一特定时刻(例如,当您准备好运行场景时)制作快照,然后检查它们之间分配的内容。
    2. 尝试在程序的特定部分打印应用程序使用的内存,以找出内存泄漏的位置。
    3. 尝试找出移除场景时未调用哪些 dealloc,然后再深入了解。
    4. 尝试调用通用函数而不是未使用的函数:

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

    【讨论】:

    • [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames]; [[CCTextureCache sharedTextureCache] removeAllTextures];我正在使用这些行。我是否应该犯错而我没有注意到。还有什么想法吗?
    • 您也可以尝试将类别添加到CCTexture2D 并覆盖init...dealloc 以更新静态NSMutableArray,然后在设置场景之前打印它。这样您就可以查看是否还有未发布的纹理。重要提示:将它们添加到NSMutableArray,作为非保留。
    • @TomaszZabłocki :我不知道如何在不增加保留计数的情况下将对象添加到 NSMutableArray。事实上,这是防止纹理从缓存中删除的可靠方法。
    • @YvesLeBorg:您可以使用[yourArray addObject:[NSValue valueWithNonretainedObject:yourObject]] 将对象添加到数组而不保留它们,然后使用[[yourArray objectAtIndex:index] nonretainedObjectValue] 获取它
    • @TomaszZabłocki:啊,有趣。谢谢
    【解决方案2】:

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

    [CCAnimationCache purgeSharedAnimationCache];
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
    [[CCDirector sharedDirector] purgeCachedData];
    
    CCLOG(@"%@<applicationDidReceiveMemoryWarning> : after purge", self.class);
    [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];
    

    这将列出仍保留在缓存中的纹理,以及它们消耗的内存量。当您希望将其处理掉时,仍然存在的任何纹理可能都存在,因为沿线(代码;))的某处,您“以某种方式”保留了它们(例如,将它们添加到数组中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      相关资源
      最近更新 更多