Я запускаю приложение iOS на устройстве iPod touch и Получаю предупреждения о памяти, даже если общий пик распределения составляет всего 7 МБ, как показано ниже (это происходит, когда нажата игровая сцена):
Что Я нахожу странным:
-
левый пик (в момент 0.00) соответствует 20 МБ выделенной памяти (сценарий введения), и, несмотря на это, НЕ дает предупреждения о памяти.
-
Центральный пик (в момент времени 35.00) соответствует нечетному 7 МБ выделенной памяти (игровая сцена подталкивается), и она дает предупреждение о памяти.
Я не понимаю, почему я получаю эти предупреждения, если общая память составляет всего 7 МБ. Это нормально? Как я могу избежать этого?
Рассматривая плотность распределения, мы можем увидеть следующую схему, которая (для меня) не показывает большой разницы между моментом, когда вводится Intro Scene (0.00) и моментом, в который нажата игровая сцена ( 35,00). Являясь пиками плотности, я бы предположил, что предупреждения о памяти связаны с чем-то другим, что я не могу определить.
EDIT:
Я предпочел использовать "Монитор активности", но, к сожалению, мое приложение падает при загрузке игровой сцены с только объемом памяти 30 МБ. Вот отчет монитора активности.
Глядя на отчет, я вижу общую сумму использования реальной памяти около 105 МБ. Учитывая, что это должно относиться к ОЗУ, и если моя модель должна иметь 256 МБ, это не должно вызывать сбои APP или проблемы с утечкой памяти.
Я запускаю монитор утечки, и он не показывает никаких утечек в моем приложении. Я также убил все остальные приложения.
Однако, анализируя отчет, я вижу удивительное 167 МБ значения виртуальной памяти, связанное с моим приложением. Это нормально? Что означает это значение? Может ли это быть причиной аварии? Как я могу определить, какие области моего кода отвечают за это?
Мой iPod - это модель 4-го поколения с емкостью 6,4 ГБ (память) и всего 290 МБ свободной памяти. Я не уверен, что это как-то влияет на производительность виртуальной памяти paging.
ИЗМЕНИТЬ 2: Я также посмотрел больше на SpringBoard, а его использование в виртуальной памяти - 180 МБ. Это нормально? Я нашел несколько вопросов/ответов, которые, похоже, предполагают, что SpringBoard несет ответственность за автореализацию объектов (это должен быть процесс управления экраном и домашним botton, но я не уверен, что это также связано с управлением памятью). Правильно ли это?
Еще одно примечание. Я использую ARC. Однако я не уверен, что это должно многое сделать с проблемой, поскольку нет явных утечек памяти, и XCode должен преобразовать код, добавляющий вызовы release/dealloc/keep в скомпилированный двоичный файл.
РЕДАКТИРОВАТЬ 3: Как сказано ранее, я использую ARC и Cocos2d (2.0). Я играл с монитором Activity. Я узнал, что если я удалю механизм проверки подлинности GameCenter, то Monitor Activity отлично работает (новое сомнение: у кого-то еще была аналогичная проблема? Где-то где-то где-то сохранилось представление проверки подлинности GameCenter?). Однако я заметил, что каждый раз, когда я перемещаюсь назад и вперед между различными сценами до GameScene (начальная сцена → Выбор персонажа → Выбор планеты → Выбор персонажа → Выбор планет → и т.д. → Выбор персонажа..), Использование REAL MEMORY увеличивается. Через некоторое время я начну получать предупреждения о памяти, и приложение будет убито iOS. Теперь вопрос:
- > Я правильно заменяю сцены? Я вызываю следующее из различной сцены:
[[CCDirector sharedDirector] replaceScene: [MainMenuScene scene]];
У меня Cocos2d 2.0 как статическая библиотека, а код replaceScene:
-(void) replaceScene: (CCScene*) scene
{
NSAssert( scene != nil, @"Argument must be non-nil");
NSUInteger index = [scenesStack_ count];
sendCleanupToScene_ = YES;
[scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
nextScene_ = scene; // nextScene_ is a weak ref
}
Интересно, почему-то сцена не освобождается должным образом. Я проверил, что метод очистки вызывается, но я также добавил вызов CCLOG метода CCLayer dealloc и перестроил статическую библиотеку. В результате метод dealloc, кажется, не называется.
Это нормально?: D
Я обнаружил, что другие люди аналогичные проблемы. Мне интересно, если это связано с сохранением циклов и самостоятельных блоков.Мне действительно нужно потратить некоторое время на изучение этого, если только из EDIT 3 никто не сможет сказать мне, что я делаю неправильно: -)