新使用 XCode Instruments 解释 iPhone 开发的内存警告,需要指导

Posted

技术标签:

【中文标题】新使用 XCode Instruments 解释 iPhone 开发的内存警告,需要指导【英文标题】:new in using XCode Instruments to interpret memory warning for iPhone development, guidance needed 【发布时间】:2012-06-15 14:19:17 【问题描述】:

我正在开发一款 iPhone 游戏,该游戏收到我没有足够经验来解释的内存警告。我一直在看一些 iTunesU 教程,但我仍然不太擅长这个..

我在运行我的游戏时收到了各种内存泄漏,我想了解如何正确解释 Instruments 中的堆栈跟踪显示。

我附上了 ObjectAllocation 工具输出 的屏幕截图。即使我缩放过滤器,我也无法过滤 ObjectSummary 中的数据。

1 中的内存使用峰值发生在初始化 GameScene 并加载所有数据(ParallaxBackground、CCSpriteBatchNode)并创建 Sprite 和子弹帧(在 spriteFrames 的 CCArray 中)时。

蓝色的大峰值只是在加载时,但应用程序冻结,然后仅在一段时间后崩溃,从图表中我看到内存使用量(蓝色条)已经下降..所以我不知道.此外,每当我尝试使用泄漏工具时,应用程序就会崩溃..

我知道对于有经验的人来说这是一个非常愚蠢的问题,但我只是需要一些额外的帮助才能开始使用此工具集。

我认为内存问题是由于我在精灵缓存类中分配的精灵造成的,但我对此不确定,因此想使用 Instruments 对此进行调查,但不知道如何查看导致内存警告的对象以及如何访问堆栈跟踪..

PS:我在第 4 代 iPod 上运行,我使用 Cocos2D 作为库

编辑:我也不明白为什么如果 Live Bytes 只有 1.01 MB,应用程序会崩溃,为什么我仍然会收到内存警告(请参阅黑旗)。是由于某些指针引用了某个空变量还是由于过多的内存分配? 1.01 MB 对我来说似乎并不多..

编辑 2:按照 Marion 的建议,我使用了活动监视器并意识到有效的实际内存使用量为 55.39 MB。我误解了“实时字节”这个词。我将尝试进一步深入研究这一点,并且暂时不接受这个问题,以便让其他人做出贡献。如果我在一两天内没有任何其他答案,我会将当前答案标记为已接受。谢谢!

非常感谢!

【问题讨论】:

【参考方案1】:

如果您想查找泄漏,请使用 Leaks 工具而不是 Allocations。要了解当前使用了多少内存,请使用 ActivityMonitor。

如果你在 cocos2d 中遇到内存问题,你可以尝试清除缓存。在 cocos2d 中,您可以清除 CCTextureCacheCCSpriteFrameCacheCCAnimationCache。它将释放未使用的纹理和帧。

如果你想检查是否所有不必要的纹理都从内存中删除,你可以在CCTextureCache 类中放置断点并调用,例如,sharedTextureCache 并查看 throw textures_ 字典的内容。或者向这个类添加一些方法,以便能够转储缓存的当前状态。

【讨论】:

CCTextureCache 已经有一个 -(void) dumpCachedTextureInfo 方法,非常方便。此外,如果您要清除未使用的纹理,请确保事先从 CCSpriteFrameCache 中清除未使用的SpriteFrame,因为它们可以引用纹理。 使用 Activity Monitor 工具检查内存使用情况,而不是分配情况。 嗯...奇怪。如果你只使用一张图集,即使是 2048x2048 像素,也不会占用超过 16MB 的内存。即使是一级内存警告也不够。通常,只有在您想确定未加载的纹理已被卸载时,您才应该清除缓存。 要么是你的纹理导致了问题,要么是其他一些类正在疯狂运行。尝试在应用程序崩溃之前潜入 [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo],它将为您记录当前在缓存中的纹理的详细信息,以及每个纹理消耗的内存量,希望在崩溃之前。在开始之前,杀死所有可能在后台的进程。老实说,您应该能够在 iPhone 4 上运行超过 55Mb 的应用程序。 实际上,甚至 90-100 Mb 也是可能的(对于 Retina 设备)。如此数量的资源会导致内存警告,但您的应用可以在所有视网膜设备上正常运行。

以上是关于新使用 XCode Instruments 解释 iPhone 开发的内存警告,需要指导的主要内容,如果未能解决你的问题,请参考以下文章

iOS xcode工具instruments的使用

Xcode>Instruments>Automation>Mac:有没有办法在 Instruments 的自动化中使用正则表达式

XCode 5 Instruments - 缺少 Stacktrace

如何读取 Xcode 6.1 Instruments .trace 文件?

XCode中 instruments 工具使用

XCode中 instruments 工具使用