【问题标题】:Memory warnings in Cocos2d/Box2d apps on device (iPhone/iPad)设备 (iPhone/iPad) 上 Cocos2d/Box2d 应用程序中的内存警告
【发布时间】:2013-01-28 10:51:46
【问题描述】:

这是 Xcode 中 profile->leaks 的信息,我在 iPad 2 上运行了大约 21 分 12 秒,然后崩溃了。

实时字节 ---- 5.45 MB

生活----13547

暂态 ---- 3845036

总字节数 -- 720.31 MB

当应用在设备上运行时,应用在控制台中打印Received Memory Warning时崩溃。

我不太确定它是如何工作的。

但是请告诉我,如果某个应用在设备上运行 21 分钟,在此运行期间总共使用了大约 720 MB 的内存,但实时字节从不超过 7.0 MB。

我接受应用程序开始时使用 3.25 MB 作为活动字节,在此运行期间它的活动字节变为 5.45 MB,我不太确定活动字节如何继续像这样增加。

但我的问题是:

它是不是一个糟糕到在设备上运行时会产生崩溃的应用程序?

或者

我是否面临其他问题?

【问题讨论】:

    标签: cocos2d-iphone


    【解决方案1】:

    您可能会在 CCTextureCache 单例中留下大量的精灵。每次创建 CCSprite 时,都会缓存(静默)纹理,以便下次引用它时,加载和呈现会更快(快得多)。在模拟器中运行分配分析(见下面的两张图片):

    顶部图像来自设备上的分配分析。最大内存 4.4 Mb。

    底部图像是相同的应用程序,相同的游戏序列,同时在模拟器中进行分析(峰值约为 78 Mb)。通过在模拟器中运行,我可以在分配中看到我的精灵使用的内存。在设备中,分配工具不占用此内存。

    您正在寻找趋势和离散的大跳跃。如果您再也没有回来,您可能会留下未使用的精灵。就我而言,我选择在游戏执行的特定点从纹理中释放特定资源。这是来自 appController 的示例

    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
        MPLOGERROR(@"Before purge");
        [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];
    
        [CCAnimationCache purgeSharedAnimationCache];
        [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
        [[CCDirector sharedDirector] purgeCachedData];
    
        MPLOGERROR(@"%After purge");
        [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];
    
    }  
    

    这是最后一搏,蛮力清理。但是您可以在游戏过程中移除不同时间点的特定纹理,而不会影响应用程序的“感知”响应能力。缓存在原则上通常是合理的,但在资源有限的情况下可能会迅速变得棘手。了解它并进行试验,最终您会找到“什么保持/什么继续”的正确组合,以实现流畅的应用程序性能。

    ps。尽管模拟器对于某些测试很好,但不要将其“性能”用作基准。模拟器性能在图形方面毫无意义,它不使用您计算机的 GPU(这就是您看到图形内存分配的原因:))。

    【讨论】:

    • 这应该是解决方案。但我认为我不能使用它 - [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames]; 因为我使用的是 Texture Packer sprite sheet 的 plist 中的帧。并且一旦删除,它们就不会自动再次添加。这占了大部分。
    • 我可以使用一些属性或代码段来确保CCSpriteFrameCache在清理后可以自动填充。
    • [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
    • 感谢您的回复..!!那肯定有帮助。当我转到我的应用程序的 applicationDidReceiveWarning: 时,它以前只显示 [[CCDirector sharedDirector] purgeCachedData];。但是现在我已经按照你的建议做了,这对我很有帮助......!!
    • 虽然我不得不小心地从我的预定选择器 tick: 中删除每一行额外的代码,它正在为每帧的物理进行所有更新和计算..!!
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多