【问题标题】:iPad crash and probably related memory problemsiPad 崩溃和可能相关的内存问题
【发布时间】:2011-04-09 07:56:08
【问题描述】:

我正在将 PC 游戏移植到具有大量图形资源(超过 250MB)的 iPad 上,我已经完成了一半。直到现在我还没有 iPad,所以我只在模拟器上进行了测试,一切都很好。但是当我第一次在设备上运行它时,它崩溃了。 我从控制台得到的只是

Program received signal:  “0”.

Data Formatters temporarily unavailable, will re-try after a 'continue'. (Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")

启动时也有警告,我在模拟器上没有,我不知道它是什么意思或是否相关:

warning: Unable to read symbols for "/Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.2/Symbols/System/Library/AccessibilityBundles/AccessibilitySettingsLoader.bundle/AccessibilitySettingsLoader" (file not found).

我能够确定游戏在加载纹理期间崩溃,大部分时间在

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);

我使用来自样本的标准纹理加载,到目前为止效果很好。我估计在崩溃时我分配了几十 mb 的纹理(我现在不能给你确切的数字)。

我在任何事情上都不是专家,但即使我没有收到任何内存警告(我检查它们),我似乎也内存不足。是否有可能我一次分配的内存比我能分配的多,它在发出内存警告之前就崩溃了?最让我惊讶的是它不会抛出异常或任何东西,它只是死在我身上。甚至调试器也没有告诉我任何信息。

还有什么其他想法会导致这次崩溃吗?

最后一件事,我知道这个问题已经被问过无数次了,但似乎没有人能很好地回答这个问题。无论如何,我会尝试询问:) 我的应用程序可以获得多少 MB 内存?是否有一些保证的最小值或理论上的(但仍然可以达到:))最大值?有什么办法可以确保我有足够的内存?

游戏有很多精美的艺术图形,即使我使用了缓存并发布了当前未使用的纹理,但一次仍然需要几十 mb 的纹理。这样的事情可能吗?职业游戏如何处理大量数据?任何文章将不胜感激。

【问题讨论】:

  • 当我看到这些错误时,通常意味着堆栈溢出。如果您在调试器中等待足够长的时间,它可能会开始加载数千帧。 YMMV。
  • 崩溃是因为你在内存中保存了所有这些纹理。你不能这样做,因为操作系统会用这个信号 0 打击你的进程,这意味着你因为分配了太多内存而被杀死。

标签: iphone memory ipad crash


【解决方案1】:

当前的 iPad 型号在系统上总共只有 256 MB 可用空间,而现在在我的设备上运行 Instruments 显示,在考虑到其他所有因素后,它只有大约 70 MB 的可用空间。因此,在纹理方面,“几十 MB”可能会推动它,具体取决于“几个”的大小。

如果您在一个不在后台线程上的操作中加载大量纹理,您将不会收到内存警告,因为您会阻塞主线程并阻止您的应用程序收到这些警告。您可以一次加载几个纹理,或者在后台线程上,或者让运行循环在每个较小的纹理加载之间完成,然后查看是否可以在加载过程中的某个时间点捕获内存警告。

Apple 在 OpenGL ES 编程指南中有一个“Best Practices for Working with Texture Data”部分,我建议您阅读。它有几个最小化纹理数据大小的技巧,其中最主要的是使用 PowerVR Texture Compression 来大幅减少它们的内存大小。

【讨论】:

  • 感谢您的提示,70MB 的限制可能是个问题,但我将不得不以某种方式处理它。将纹理转换为 pvr 并缩小尺寸是我今天的计划。我也会考虑在后台加载纹理
【解决方案2】:

我的应用可以获得多少 MB 内存?是否有一些保证的最小值或理论上的(但仍然可以达到:))最大值?

您可以拥有 500 兆的可用内存,但它可能由于碎片而无法使用(例如,程序 XYZ 可能占用了 255 到 284 MB 之间的空间)。 从那以后,就有一个内存问题,每个调用的 malloc() 都可以使用。

现在这种情况很少见(内核和垃圾收集器足够聪明),但仍然 - “内存不足”是“无法加载共享库 *.dylib:无法找到渴望 N mbs 的空闲空间段”。

【讨论】:

  • 所以我得到崩溃“无法加载共享库...”而不是内存警告的事实是因为我试图分配太大的内存块?
  • 是的,但没有调试就无法证明。为什么不编写一个测试程序,尝试以大块/小块的形式分配大量 RAM,并估计加载数据的最佳方式?
  • 嗯...听起来是个好主意。我试试看,谢谢!
  • 实际上,目前的 iPad 只有 256 MB 的总 RAM,其中很大一部分用于操作系统。
  • 原来是因为我分配(或 opengl 分配了)太大的内存块,它无法发出内存警告。感谢您的帮助和所有其他人的意见
【解决方案3】:

您是否在任何写入/加载之前检查所有内存分配和数组边界?

【讨论】:

  • 不是全部,但关键的东西(我怀疑可能是问题)没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多