Тайна памяти iPad1 с моим текстурным игровым приложением - PullRequest
0 голосов
/ 22 августа 2011

Извините за смутное название, но не совсем уверен, как его обобщить.

Факты таковы:

  • У меня есть игра, которая была одобрена Apple и включенаApp Store.
  • Это универсальное приложение.Он использует текстуры, разработанные для 320x480 на небольших экранах, и использует более крупные текстуры (примерно в четыре раза больше) на экранах Retina и iPad.
  • При разработке я иногда видел предупреждения о нехватке памяти в журнале консоли,но после прочтения о них мне показалось, что они часто были несколько ложными / неважными, и в любом случае у меня не было сбоев и моих тестеров на различных устройствах (iPod Touch 2-го поколения, iPod Touch 4-го поколения, iPhone3, iPhone4, iPad1, iPad2) не видели сбоев.
  • Когда я начал распространять приложение среди более широкого набора бета-тестеров через TestFlightApp, я получил сообщения о том, что некоторые люди видят сбои во время загрузки приложения или очень рано после того, как пользовательвыбрал уровень из главного меню, и приложение загружало текстуры уровней.Мы обнаружили, что если эти пользователи просто перезагружают свои устройства, у них больше не будет проблем.Так как это было впервые, когда мы видели подобные проблемы, мы связали это с чем-то, что делал TestFlightApp, каким-то забавным состоянием, когда он оставлял устройство после установки (мы говорили об этом с TestFlightApp, и они никогда не слышали о такой вещи).).
  • Как уже говорилось, Apple одобрила приложение и оно есть в App Store.Вскоре после того, как он вышел в эфир, мы получили сообщения от некоторых пользователей iPad1 о том, что он зависал при загрузке приложения или вскоре после этого, то же самое, что мы видели у некоторых пользователей TestFlightApp.И, как и в случае с пользователями TestFlightApp, эти клиенты сообщили, что перезапуск часто решает проблему.Но это было не так приятно, потому что проблема имела тенденцию появляться снова.Одна из этих пользователей прислала мне несколько файлов журнала LowMemory ..., которые она сняла со своего компьютера после синхронизации своего iPad.Было около 10 таких файлов, и ни один из них не перечислил мою программу в списке процессов.Вместо этого он показывал другие программы, помеченные как (активные) или (сброшенные), и «Самым большим процессом» может быть что угодно, от MobileSafari до Kobo, но опять же мое собственное приложение никогда не было в списке.Итак, я не понял этого, но суть в том, что, по крайней мере, для этого пользователя что-то толкает память за некоторый предел, когда мое приложение не работает нормально.
  • У меня с тех порвернулся и поговорил с одним из бета-тестеров TestFlightApp, и оказалось, что он действительно иногда снова дает сбой приложения, так что это был не просто остаток от TestFlightApp.Однако, для него сбой гораздо реже, чем для этого клиента.
  • У других тестеров iPad1 игры никогда не было проблем.Они сообщают, что играют в игру по несколько часов каждый день, используют свой iPad с несколькими другими приложениями между ними и редко выключают его.Точно так же у меня никогда не было сбоев с моим iPod Touch 4-го поколения, который похож на iPad1, в котором он имеет экран высокого разрешения, но только 256 КБ ОЗУ.

Итак, очень загадочномне, что может быть таким особенным в iPad этих конкретных пользователей.Таинственно, что игра работает после перезапуска устройства, но затем, после запуска некоторых приложений, у игры (иногда) возникают проблемы с загрузкой.Насколько я понимаю, если моей игре требуется память, ОС автоматически закрывает все запущенные приложения по мере необходимости, чтобы эффективно восстановить объем памяти, доступный на только что перезапущенном устройстве.Мой единственный вывод заключается в том, что после запуска некоторых приложений устройство остается в состоянии, когда доступно меньше памяти, поскольку ОС не может восстановить определенные блоки памяти или закрыть определенные приложения.

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

У кого-нибудь есть идея получше?

1 Ответ

2 голосов
/ 22 августа 2011

Похоже, что всплеск памяти во время загрузки текстуры является причиной остановки приложения на некоторых устройствах.Он вполне может использовать меньше памяти после загрузки всего, чем в конце начальной загрузки.Это может быть объяснено тем, что что-то выталкивается в виртуальную память, тогда как прямая загрузка текстур могла бы бомбардировать ОЗУ со слишком большим количеством выделений.Я бы посоветовал:

  • Быть более агрессивным с уничтожением временных структур данных во время загрузки (release временная структура, когда все ее полезные значения были прочитаны / извлечены другими вещами)
  • Для autorelease d объектов всегда держите NSAutoreleasePool;вы можете даже захотеть drain и повторно alloc пул несколько раз в течение одного метода, если вы используете чрезвычайно большое количество autorelease d объектов.
  • Это может звучать глупо ... намереннозамедлите процесс загрузки.Если вы избавитесь от распараллеленных загрузок (загрузка нескольких объектов одновременно) или, возможно, вставите ручную задержку в поток / методы загрузки, это может дать ОС больше времени для загрузки объектов в виртуальную память, и, таким образом, Watchdog не будет определять приложение какбыть оперативной памятью.

РЕДАКТИРОВАТЬ: Одна из возможных тактик для реализации медленной загрузки: если / когда вы получаете предупреждение о нехватке памяти, пауза или медленная загрузка на несколько секунд длядайте другим приложениям время, чтобы уменьшить использование памяти, затем продолжайте загрузку с нормальной скоростью.

Даже если я ошибаюсь (если файлы LowMemory...log показывают виртуальное + физическое использование и, следовательно, ваше приложение даже не делает этогомного), я бы предложил затем интегрировать сообщения об ошибках, такие как QuincyKit, чтобы вы получили по электронной почте описание трассировки и сбоя, когда эта ошибка встречается в дикой природе.

...