Сбой iPad и, возможно, проблемы с памятью - PullRequest
2 голосов
/ 07 сентября 2010

Я портирую компьютерную игру на iPad с тоннами графических ресурсов (более 250 МБ), и я на полпути.До сих пор у меня не было 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);

Я использую стандартную загрузку текстур из образцов, и это сработалопока отлично.По моим оценкам, во время аварии я выделил несколько текстур на несколько десятков мегабайт (сейчас я не могу дать вам точное число).

Я не эксперт ни в чем, но, похоже, мне не хватает памяти, хотя я не получаю никаких предупреждений о памяти (я проверяю их).Возможно ли, что я выделяю больше памяти, чем могу, и происходит сбой, прежде чем он может выдать предупреждение памяти?Что меня больше всего удивляет, так это то, что он не бросает исключения или что-то еще, он просто умирает от меня.Даже отладчик ничего мне не говорит.

Есть еще идеи, что может вызвать этот сбой?

И еще одна вещь, я знаю, что об этом спрашивали бесчисленное количество раз раньше, но, похоже, никтоесть хороший ответ на это.Я все равно попробую спросить :) Сколько МБ памяти я могу получить для своего приложения?Есть ли гарантированный минимум или теоретический (но все же достижимый :)) максимум?Есть ли способ, как обеспечить мне достаточно памяти?

В игре много причудливой художественной графики, и хотя я использую кеширование и выпускаю текстуры, которые в настоящее время не используются, все равно будет несколько десятковмб текстур, необходимых за один раз.Возможно ли что-то подобное?Как профессиональные игры обрабатывают много данных?Любая статья будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 08 сентября 2010

Текущая модель iPad имеет всего 256 МБ свободного места в системе, и запуск Instruments на моем устройстве сейчас показывает, что у него есть только ~ 70 МБ этого свободного для использования, после того как все остальное будет учтено.Следовательно, «несколько десятков МБ» могут выдвигать его, когда дело доходит до текстур, в зависимости от размера «нескольких».

Если вы загружаете огромное количество текстур в одной операции, которая не включенаВ фоновом потоке вы не будете получать предупреждения о памяти просто потому, что вы закроете основной поток и не допустите, чтобы ваше приложение получило эти предупреждения.Вы можете загружать текстуры по несколько раз либо в фоновом потоке, либо позволяя циклу выполнения завершаться между каждой меньшей загрузкой текстуры, и посмотреть, сможете ли вы перехватить предупреждения памяти в какой-то момент процесса загрузки.

У Apple есть раздел " Рекомендации по работе с данными текстуры " в Руководстве по программированию OpenGL ES, который я предлагаю вам прочитать.В нем есть несколько советов по минимизации размера текстурных данных, среди которых главным является использование PowerVR Texture Compression для значительного уменьшения размера в памяти.

1 голос
/ 07 сентября 2010

Сколько МБ памяти я могу получить для своего приложения?Существует ли какой-то гарантированный минимум или теоретический (но все же достижимый :)) максимум?

У вас может быть 500 мегабайт свободной памяти, но она может быть недоступна из-за фрагментации (программа XYZ могла занимать пробелнапример, между 255 и 284 МБ).После этого возникает вопрос о памяти, которая доступна для каждого вызываемого malloc ().

В настоящее время это редкая ситуация (ядро и сборщики мусора достаточно умны), но все же - "недостаточно памяти""не могу загрузить общую библиотеку * .dylib: не могу найти сегмент свободного пространства, жаждущий N mbs".

0 голосов
/ 07 сентября 2010

Проверяете ли вы все свои выделения памяти и границы массива перед записью / загрузкой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...