новое в использовании XCode Instruments для интерпретации предупреждения о памяти для разработки iPhone, требуется руководство

Я работаю над игрой для iPhone, которая получает предупреждение памяти о том, что у меня недостаточно опыта для интерпретации. Я смотрел учебник iTunesU, но я все еще не очень хорош в этом.

Я получил различные утечки памяти во время запуска моей игры, и я хотел понять, как правильно интерпретировать отображение трассировки стека в Instruments.

Я прикрепляю скриншот вывода инструмента ObjectAllocation instruments output. Даже когда я использую фильтр масштабирования, мне не удается отфильтровать данные в ObjectSummary см. этот снимок экрана.

Пиковое использование памяти в 1 происходит, когда GameScene инициализируется и все данные загружен (ParallaxBackground, CCSpriteBatchNode) и создаются кадры спрайтов и маркеров (в массиве CCArray spriteFrames).

Большой синий пик появляется только во время загрузки, но приложение зависает, а затем вылетает только через некоторое время, и на графике я вижу, что использование памяти (синяя полоса) снизилось ... так что я не понимаю этого. Кроме того, всякий раз, когда я пытаюсь использовать инструмент утечки, приложение вылетает.

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

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

PS: я работаю на iPod 4-го поколения и использую Cocos2D в качестве библиотеки.

РЕДАКТИРОВАТЬ: я также не понимаю, почему, если живые байты составляют всего 1,01 МБ, приложение вылетает и почему я все еще получаю предупреждение о памяти (см. черные флажки). Это связано с тем, что какой-то указатель ссылается на какую-то нулевую переменную или из-за чрезмерного выделения памяти? 1,01 Мб мне кажется мало..

РЕДАКТИРОВАНИЕ 2. Следуя совету Марион, я воспользовался Монитором активности и понял, что эффективное реальное использование памяти составляет 55,39 МБ. Я неправильно истолковал слово «живые байты». Я постараюсь углубиться в это и оставлю этот вопрос как неприемлемый на данный момент, чтобы позволить другим людям внести свой вклад. Если у меня не будет другого ответа в течение одного-двух дней, я отмечу текущий ответ как принятый. Спасибо!

Монитор активности

Большое спасибо!


person mm24    schedule 12.06.2012    source источник


Ответы (1)


Если вы хотите найти утечки, используйте инструмент Leaks вместо Allocations. Чтобы узнать, сколько памяти используется в данный момент, используйте ActivityMonitor.

Если у вас будут проблемы с памятью в cocos2d, вы можете попробовать очистить кеш. В cocos2d вы можете очистить CCTextureCache, CCSpriteFrameCache, CCAnimationCache. Он освободит неиспользуемые текстуры и рамки.

Если вы хотите проверить, все ли ненужные текстуры были удалены из памяти, вы можете поставить точку останова на класс CCTextureCache и вызвать, например, sharedTextureCache и посмотреть скинуть содержимое словаря textures_. Или добавьте в этот класс некоторый метод, чтобы иметь возможность сбрасывать текущее состояние кеша.

person Morion    schedule 12.06.2012
comment
В CCTextureCache уже есть метод -(void) dumpCachedTextureInfo{}, очень удобный. Кроме того, если вы очищаете неиспользуемые текстуры, убедитесь, что вы заранее удалили неиспользуемые кадры спрайтов из CCSpriteFrameCache, поскольку они могут ссылаться на текстуры. - person YvesLeBorg; 13.06.2012
comment
о, возможно, я использовал старую версию cocos2d, потому что мне пришлось самому добавить метод дампа =) - person Morion; 13.06.2012
comment
ну, этот маленький хикки меня очень выручил (за отсутствием ОЧЕВИДНЫХ утечек - те инструменты и Analyze находят все сами). Не каждая проблема с памятью оказывается утечкой, но управление текущим объемом памяти может оказаться сложной задачей. - person YvesLeBorg; 13.06.2012
comment
@YvesLeBorg спасибо за ваш вклад, и Марион спасибо за ваш ответ. Я играю с этими методами и пытаюсь найти правильное место для их вызова. Я опубликую некоторые обновления в ближайшее время. Кроме того, я до сих пор не понял, как правильно проверять память с помощью инструментов и почему, когда я запускаю приложение утечки памяти на реальном устройстве, оно даже не запускает сцену (также запуск только инструмента выделения объектов приводит к сбою приложения). ранее, и я думаю, это связано с некоторым дополнительным процессом памяти, запущенным инструментами на устройстве).. посмотрю снова учебник и скоро опубликую! Спасибо.. - person mm24; 13.06.2012
comment
PS: я добавил редактирование с сомнением в отношении байтов Live ... возможно ли, чтобы некоторые из вас прокомментировали это? Заранее большое спасибо.. - person mm24; 13.06.2012
comment
проверяйте использование памяти с помощью инструмента Activity Monitor, а не распределения. - person Morion; 13.06.2012
comment
Хорошо, я сделаю ... Я только что попытался удалить неиспользуемые спрайты и текстуры (у меня есть один лист спрайтов, загруженный в кеш текстур). приложение вылетит из-за того, что не найдет кадр спрайта в файле CCSpriteFrameCache. Поэтому я запутался, как удалить только кадр спрайта спрайтов-анимации, которые уже были выделены, а не тот, который еще не был. Это невозможно преодолеть с помощью одного кеша текстур, или я должен удалить каждый отдельный кадр спрайта вручную? Спасибо! - person mm24; 13.06.2012
comment
хм... странно. если использовать только один атлас, даже 2048х2048 пикселей, он не может занимать больше 16Мб памяти. недостаточно получить предупреждение даже первого уровня памяти. обычно вам следует очищать кеш, только если вы хотите быть уверенным, что неиспользуемые текстуры были выгружены. - person Morion; 13.06.2012
comment
@Marion Я использую лист-атлас спрайтов текстуры (2048 * 2048) для всех элементов GameScene, таких как персонажи, пули и значки, и еще 2 в дочернем элементе ParallaxBackground класса GameScene, который имеет 7 фоновых спрайтов. В этом втором классе я удаляю SpriteFramesFromFile после создания всех спрайтов ([[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromFile:@bottom.plist];), а также удаляю каждый TextureForKey после каждой инициализации спрайта ([[CCTextureCache sharedTextureCache] removeTextureForKey:[NSString stringWithFormat: @bottom%i.png, i]];). Поделюсь кодом? - person mm24; 13.06.2012
comment
PS: я добавил второй EDIT, который, я думаю, отражает это.. Итак, если у меня есть 3 листа спрайтов (извините, что сказал 1 раньше, но я думал, что удаления, которое я делаю, было достаточно), то у меня должно быть максимум около 48 МБ памяти.. Имеет ли это смысл? Я не знаю, как его вычислить, но я предполагаю, что если 1 равно 16 МБ, то 3 равно 48 МБ. Дело в том, что 2,048 * 2,048 - это примерно 4,194,304, которые я не могу соотнести с 16 МБ.. извините за путаницу.. :( - person mm24; 13.06.2012
comment
Либо это ваши текстуры вызывают проблему, либо какой-то другой класс зашкаливает. Попробуйте проникнуть в [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo] до того, как приложение выйдет из строя, оно зарегистрирует для вас детали того, какие текстуры в данный момент находятся в кеше и сколько памяти потребляет каждая из них, надеюсь, до сбоя. Прежде чем начать, убейте все процессы, которые могут быть в фоне. Честно говоря, вы должны иметь возможность запускать приложение размером более 55 МБ на iPhone 4. - person YvesLeBorg; 13.06.2012
comment
на самом деле возможны даже 90-100 Мб (для ретина-устройства). Такое количество ресурсов вызовет предупреждения о памяти, но ваше приложение будет нормально работать на всех устройствах Retina. - person Morion; 13.06.2012
comment
@IvesLeBorg спасибо. Я попробую (я пишу несколько специальных тестов, которыми поделюсь через несколько часов). Итак, если и вы, и Мэрион считаете, что 55 МБ не должно быть слишком много, возможно, проблема в чем-то другом? Я думаю об указателях на нулевые переменные, поскольку использую классы кеша Bullet-Enemy. Я перепишу все шаг за шагом, отслеживая реальное использование памяти и предупреждения о памяти: 1 приложение только с фоном параллакса 2: добавить фон 3: добавить пули. , что вы, ребята, делаете, когда получаете предупреждение о памяти? как вы справляетесь с добавлением врагов во время выполнения? Вы предварительно выделяете (кешируете) или нет? - person mm24; 14.06.2012
comment
@IvesLeBorg Я добавил новый вопрос о SO, касающийся реального использования памяти ... очень длинный, но если у вас есть время, не могли бы вы взглянуть? Спасибо! stackoverflow.com/questions/11042668/ - person mm24; 15.06.2012
comment
@Morion, как сказал IvesLeBorg, я добавил новый вопрос о SO, касающийся реального использования памяти, но он очень длинный ... если у вас есть время, не могли бы вы взглянуть? Большое спасибо и извините за многочисленные комментарии! stackoverflow.com/questions/11042668/ - person mm24; 15.06.2012