我正在将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的纹理。这样的事情甚至可能吗?专业游戏如何处理大量数据?任何文章都将不胜感激。
答案 0 :(得分:3)
目前的iPad型号在系统上总共只有256 MB,现在我的设备上运行的仪器显示在考虑其他所有内容之后它只有大约70 MB的免费使用。因此,“几十MB”可能会在纹理方面推动它,具体取决于“少数”的大小。
如果您在一个不在后台线程上的操作中加载大量纹理,则不会因为您堵塞主线程并阻止应用程序接收这些警告而收到内存警告。您可以在后台线程上一次加载几个纹理,或者让每个较小纹理加载之间的运行循环完成,并查看是否可以在加载过程中的某个时刻捕获内存警告。
Apple建议您阅读OpenGL ES编程指南中的“Best Practices for Working with Texture Data”部分。它有几个最小化纹理数据大小的技巧,其中最主要的是使用PowerVR纹理压缩来大规模减少其内存大小。
答案 1 :(得分:1)
我的应用可以获得多少MB的内存?是否有一些保证的最小值或理论值(但仍可达到:)最大值?
您可以拥有500兆的可用内存,但由于碎片可能无法使用(例如,程序XYZ可能占用了255到284 MB之间的空间)。 因此,存在一个内存问题,可用于每个调用的malloc()。
现在这是一种罕见的情况(内核和垃圾收集器足够智能),但仍然 - “内存不足”是“无法加载共享库* .dylib:无法找到渴望N mbs的可用空间段”。
答案 2 :(得分:0)
您是否在任何写入/加载之前检查所有内存分配和数组边界?