2010-09-07 34 views
2

我正在將PC遊戲移植到擁有大量圖形資產(超過250MB)的iPad上,而我大約過了一半。我現在沒有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的紋理。是甚至可能的嗎?專業遊戲如何處理大量數據?任何文章將不勝感激。

+0

當我看到這些錯誤時,通常意味着堆棧溢出。如果在調試器中等待足夠長的時間,它可能會開始加載數千幀。因人而異。 – 2010-09-07 17:28:01

+0

由於您將所有這些紋理保存在內存中,導致崩潰。你不能這樣做,因爲操作系統會用這個信號0打你的進程,這意味着你因爲分配太多內存而被殺死。 – MoDJ 2013-07-19 17:50:22

回答

1

我可以爲我的應用程序獲得多少MB內存?有一些保證最低或理論(但仍然可達:))最大?

您可以擁有500兆空閒內存,但由於碎片(例如,程序XYZ可能佔用了255到284 MB之間的空間)而可能不可用。 既然如此,存在一個內存問題,即每個malloc()都可用。 (內核和垃圾收集器足夠智能),但仍然 - 「內存不足」是「無法加載共享庫* .dylib:找不到空閒空間段渴望N mbs」。

+0

所以我得到崩潰的事實「無法加載共享庫...」而不是內存警告是因爲我嘗試分配太大的內存塊? – Lope 2010-09-07 17:45:33

+0

是的,但沒有調試就不能證明。爲什麼不寫一個試圖在大/小塊中分配大量RAM的測試程序,並估算加載數據的最佳方式? – 2010-09-07 18:08:57

+0

嗯...聽起來像個好主意。我會試一試,謝謝! – Lope 2010-09-07 18:42:35

0

在任何寫入/加載之前是否檢查了所有內存分配和數組邊界?

+0

不是所有的問題,但關鍵的東西(我懷疑可能是問題)是好的 – Lope 2010-09-07 18:56:41

3

目前iPad的型號在系統上只有256 MB可用總數,現在我的設備上正在運行的儀器顯示它只有約70 MB的空閒空間用於考慮其他一切後。因此,當涉及紋理時,「幾十MB」可能會推動它,這取決於「幾個」的大小。

如果您在一個不在後臺線程中的操作中加載大量紋理,您將不會收到內存警告,只是因爲您會阻塞主線程並阻止應用程序接收這些警告。您可以一次加載幾個紋理,無論是在後臺線程上還是讓運行循環在每個較小的紋理加載之間完成,並查看您是否可以在加載過程的某個時刻捕獲內存警告。

Apple建議您閱讀OpenGL ES編程指南中的「Best Practices for Working with Texture Data」部分。它有幾個提示最小化紋理數據大小的技巧,其中主要是使用PowerVR紋理壓縮來大幅減少內存大小。

+0

感謝您的提示,70MB的限制可能是一個問題,但我將不得不以某種方式處理它。將紋理轉換爲pvr並縮小尺寸是我今天的計劃。我也會考慮在後臺加載紋理 – Lope 2010-09-08 07:09:37