【发布时间】: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 打击你的进程,这意味着你因为分配了太多内存而被杀死。