我正在移植PC游戏到iPad,它有吨的图形资产(超过250MB),我大约一半。我直到现在还没有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的纹理需要一次。这样的事情有可能发生吗?职业游戏是如何处理大量数据的?任何文章都将不胜感激。
发布于 2010-09-08 05:08:13
当前型号的iPad在系统上总共只有256MB的可用空间,现在在我的设备上运行Instruments显示,在考虑到其他所有因素后,它只有大约70MB的可用空间。因此,当涉及到纹理时,“几十MB”可能会推动它,这取决于“几个”有多大。
如果你在一个不在后台线程上的操作中加载大量的纹理,你不会收到内存警告,因为你会阻塞主线程,并阻止你的应用程序接收这些警告。可以一次加载几个纹理,可以在后台线程上加载,也可以通过让run循环在每个较小的纹理加载之间完成,并查看是否可以在加载过程中的某个点捕获内存警告。
苹果在OpenGL ES编程指南中有一个"Best Practices for Working with Texture Data“部分,我建议你读一读。它有几个最小化纹理数据大小的技巧,其中最重要的是使用PowerVR纹理压缩来大量减少内存中的大小。
https://stackoverflow.com/questions/3661051
复制相似问题