【问题标题】:Why would Xcode show MUCH more memory use than Instruments for SceneKit app?为什么 Xcode 会比 Instruments for SceneKit 应用程序显示更多的内存使用?
【发布时间】:2019-05-11 21:30:14
【问题描述】:

我正在尝试调试为什么我们基于 SceneKit 的应用程序使用这么多内存,但 Xcode 和 Instruments / Allocations 似乎对正在使用的内存量有非常不同的值。当我查看 Xcode 时,我看到类似 600 MB 但是当我将相同的运行会话转移到 Instruments / Allocations 时,我看到持久字节的数量非常不同,例如 150 MB强>。

哪一个是正确的?为什么有区别?他们在测量不同的东西吗?

(无论我是转移 Xcode 调试会话还是在 Instruments 中重新开始,似乎都没有太大区别。)

我关心的原因是 iOS 因过度使用内存而终止应用程序(根据 Xcode),但我似乎无法通过 Instruments 找到问题。

我已尝试关闭所有 GPU 和 Metal 调试选项,但它们似乎没有任何作用。

【问题讨论】:

  • “他们测量的是不同的东西吗?”很有可能。测量设备上的发布版本。不要在模拟器中测量,也不要测量 Debug 版本,因为你会得到完全错误的内存使用信息。
  • 谢谢马特,但我应该在我最初的问题中包括我已经尝试过调试和发布版本,并且与调试版本相比,每种情况下发布的数字都在 1-2MB 以内。我也只在设备上运行,从不在模拟器上运行,因为在模拟器上,SceneKit 性能不可用,也不支持 PBR。
  • 好的,在这种情况下,我会说简单的答案是:相信 Instruments。

标签: ios scenekit arkit


【解决方案1】:

哪一个是正确的?

我的直觉是:乐器。它使用 Dtrace 来(抱歉)检测您的代码并观察实际的分配和释放,但会牺牲性能。 Xcode 调试导航器内存图更像是一个外部视图,旨在提供对正在发生的事情的一般感觉。这正是后者为您提供了一种切换到前者的方法的原因——因为(仪器)是您将获得真正测量的地方。

(但是,请记住,Instruments 可能无法将您看到的一些图形虚拟内存后备存储包括在总数中。有很多 WWDC 视频更详细地讨论了这个主题。)

【讨论】:

  • 感谢您的建议。我能找到的一件事是如何使用 Xcode Capture GPU Frame 命令。这显示了当前纹理和缓冲区的列表,但我没有找到任何显示它们使用的内存或 VM 的总和。然而,对一个空的 SCNView 做一些粗略的添加,我总共可以增加大约 50MB 的屏幕大小的 RGBA 和 BGRA 纹理,但 Xcode 显示的总内存使用量为 211MB,Instruments 显示总共为 43MB。因此,Xcode / iOS 似乎仍有大量内存未计入或计算错误。
  • 但是 VMTracker 仪器呢?并参见例如stackoverflow.com/questions/15536557/…
  • 谢谢,你是对的,内存原来是常驻/脏虚拟机,它可以通过虚拟机跟踪器看到。这篇博文是理解它的一个很好的起点:liam.flookes.com/wp/2012/05/03/finding-ios-memory 和 WWDC 2018 上的 iOS 内存深度讨论,developer.apple.com/videos/play/wwdc2018/416 有更多细节。不幸的是,绝大多数 VM 是由 IOKit 分配的,所以它可能是纹理图像。
【解决方案2】:

我知道这个答案已经很晚了,但是为了将来遇到同样问题的开发人员,我建议您检查资产文件夹中的图像。如果您的任何图像的尺寸大于 1000 x 1000,则应按比例缩小它们。在上面的示例中,图像包含 1000000 个像素。按照图像的加载方式(每像素 4 个字节),这意味着 4 MB 的内存用于加载图像。我不知道的是,我的资产文件夹中有一张大约 3600 * 4000 的图像。算一算,这超过了 50 MB 的内存使用量!

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 2011-10-10
    • 2012-05-30
    • 1970-01-01
    • 2010-10-16
    • 2011-11-06
    • 2023-03-15
    • 2021-09-21
    • 2016-01-10
    相关资源
    最近更新 更多