Нет утечек памяти, но все еще не хватает памяти? - PullRequest
0 голосов
/ 15 сентября 2010

В моем приложении cocos2d я пробежал по нему с помощью инструментов и устранил все утечки памяти.Моя игра выводит, сколько памяти используется на экране, и она постоянно растет по мере того, как игра прогрессирует, пока у меня не закончится память.Количество объектов на экране не очень сильно увеличивается с каждым уровнем.Это довольно простая игра, поэтому у меня не должно быть нехватка памяти так скоро.

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

Ответы [ 6 ]

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

То, что инструменты не показывают утечек, не означает, что вы по-прежнему не выделяете память, которую не используете.Обратите внимание на график ObjectAlloc и посмотрите, будет ли он постоянно расти, не падая.

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

Отличный способ проверить объекты, которые агрегируются в памяти, - это использовать новую функциональность инструментов (в Xcode 3.2.3) Heap Shot.

Используйте обычный инструмент Allocations для вашего работающего приложения.Выполните серию повторяющихся событий, которые должны вернуться в некое известное состояние (например, перейти на один уровень вниз в контроллере навигации и вернуться).Каждый раз, когда вы делаете это, нажимаете кнопку Mark Heap в левой боковой панели для инструмента Allocations (под заголовком раздела Heapshot Analysis).

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

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

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

Будьте осторожны с автоматически выпущенными объектами, поскольку они не освобождаются немедленно.Если у вас есть разделы с большим количеством выделений и автоматическим выпуском, попробуйте использовать для них специальные пулы автоматического выпуска.Это случилось со мной при создании огромных деревьев решений (используя NSArrays) для игрового ИИ.

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

В Objective-C при использовании авто-релизных объектов опасайтесь циклических зависимостей!

Если вы создаете объект A, а затем экземпляр объекта B и передаете ему A, так что B сохраняет A, а A также сохраняет B (например, добавляя его как дочерний элемент к A), вы можете легко настроить циклическую зависимость и, таким образом, оба объекта не будут освобождены.

Совет: добавьте метод - (void) dealloc ко всем классам сцены и установите там точку останова. Если вы изменили сцену и ее метод dealloc не был вызван после завершения перехода сцены, вы пропускаете эту сцену (она не освобождается).

Попробуйте найти эту утечку, отыскивая установку, аналогичную той, что я описал выше.

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

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

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

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

Большая часть проблемы заключается в том, что спрайты не выпускаются в cocos2d, если все действия на этих спрайтах не были остановлены. Это делается с помощью stopAllActions. Приветствую за все предложения.

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