Приложение для iPhone работает сотни раз, затем вылетает из-за ошибки памяти при запуске, а затем не работает до перезапуска - почему?

У меня есть игра для iPhone на Cocos2d / openGL. Это универсальное приложение, и я иногда сталкиваюсь с неприятной ошибкой на iPad.

Мы загружаем много текстур заранее (3 текстуры 2048x2048). Я работаю над уменьшением этой предварительной нагрузки, но меня беспокоит то, что я действительно не понимаю первопричину этого сбоя, который навсегда нарушает работу приложения.

Вот в чем дело: 1. Приложение отлично работает для сотен воспроизведений на iPad 2. В конце концов (я предполагаю, что из-за того, что другие программы используют некоторую память и не отпускают, или что-то еще) приложение начинает вылетать при запуске. Он просто снова закрывается в середине загрузки. 3. Приложение теперь никогда больше не будет работать на этом iPad, закрываясь каждый раз немедленно, пока iPad не будет перезапущен.

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

РЕДАКТИРОВАТЬ: забыл добавить

Лаги при сбое органайзера просто говорят о нехватке памяти, как это каждый раз (я изменил имя своего приложения на MyAppName ниже). Опять же, я знаю, что памяти мало, но почему она остается низкой до перезапуска ?:

Incident Identifier: E7A2507C-3FB1-4E3B-B315-09F094236541
CrashReporter Key:   0fda9d667f2c6073f20a76809aa25438b6854d15
OS Version:          iPhone OS 3.2 (7B367)
Date:                2010-04-30 16:59:44 -0400

Free pages:        437
Wired pages:       17228
Purgeable pages:   0
Largest process:   MyAppName

Processes
         Name                 UUID                    Count resident pages
       MyAppName <6307ce41802850944baa78d29224fa7f>   22385 (jettisoned) (active)
    mediaserverd <ea8bac28b06fe3980fdd44b5caceb563>     242
      DTMobileIS <a0f651e43881e66f50f8a95abea72921>    5826
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      67
    syslog_relay <4ceaed776d2df957fa130712f4ef21d0>      66
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      67
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      67
            afcd <4f3c9566e33b4463f05603d990584e5d>      72
            ptpd <83de0f774bd6553d513ae9e19b0f9b56>     181
         syslogd <66247e305d5c0bf6f1ce1cc950653263>      81
             lsd <a4d852c1c8da2b3d231bdc90887b52ba>     130
            iapd <a8534cbde4b90ad5915dd26ab03ff3e3>     204
         notifyd <5e9d5bee7c3eae1c8b494c79eb11406e>      71
        BTServer <64e4a6ea6b1240db2331e05a29caa862>     108
      CommCenter <97bf297944ac4bde19bcee96dd23bd5f>     181
     SpringBoard <c7a5904c12db7b14334a4edaa4cabaa9>    5339 (active)
         configd <aca9fa3380322669164fd6b1a3864300>     373
   fairplayd.K48 <2d997ffca1a568f9c5400ac32d8f0782>      84
       locationd <dd1ea88105c62173908ce767db5c4d37>     599
   mDNSResponder <820560222d47a1f2a0dce98a7f8a9721>     108
       lockdownd <497fd54c79a680bf29f5d9320f514613>     303
MobileStorageMou <c277b79c2157c4dc5cfc5c3ca35bd5f2>      69
         launchd <66972eee4d865c4383b33d985d22994b>      98

**End**


person peter    schedule 01.05.2010    source источник


Ответы (2)


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

Ваш журнал сбоев показывает, что ваше приложение использовало 22385 страниц памяти, что составляет около 87 мегабайт (при условии, что размер страницы такой же на iPad и iPhone, что составляет 4 КБ на iPhone).

Кроме того, это показывает, что SpringBoard использует 5339 страниц памяти, что составляет около 20 мегабайт. Я не знаю об OpenGL, но я слышал, что с Core Animation, всякий раз, когда изображения устанавливаются как содержимое CALayer, несжатые данные изображения размещаются в общей памяти, управляемой SpringBoard.

В общем, 87 + 20 мегабайт - это много памяти для устройства с 256 мегабайтами ОЗУ и без файла подкачки ...

person Pascal Bourque    schedule 03.05.2010

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

person gnasher    schedule 01.05.2010