2

这是 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,我不太确定活动字节如何继续像这样增加。

但我的问题是:

在设备上运行时,它是否足以导致崩溃的应用程序?

或者

我是否面临其他问题?

4

1 回答 1

5

您可能会在 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];

}  

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

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

于 2013-01-28T14:50:48.527 回答