Самый эффективный метод удаления потомков из DisplayObject в as3? (Объем памяти) - PullRequest
1 голос
/ 14 августа 2011

Каков наиболее эффективный способ удаления дочерних элементов из спрайта / мувиклипа в отношении памяти и сбора мусора?

Я видел по крайней мере три пути.

Простое переназначение

sprite = new Sprite();

ноль, а затем новый

sprite = null
sprite = new Sprite();

или удаление во время (которое мне нравится)

while(sprite.numChildren > 0){   
    sprite.removeChildAt(0); 
}

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

Ответы [ 2 ]

5 голосов
/ 14 августа 2011

removeChild или removeChildAt фактически не удаляет Sprite или любой другой объект DisplayObject из памяти, он только удаляет его из списка отображения. Это означает, что если вы создадите 1000 спрайтов и добавите их в рабочую область (displaylist), а затем используете removeChild для всех 1000 спрайтов, они все равно могут существовать в памяти навсегда.

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

Если вы действительно хотите удалить его, просто обнулите его и проверьте следующее:

  • Удалите его из списка отображения, используя removeChild или removeChildAt
  • Удалить все EventListeners, которые прикреплены к клипу.
  • Если вы использовали ссылку в массиве, векторе, словаре или любом другом объекте, удалите его из объекта, установите для него значение null или склейте его с помощью Array.splice ()
  • Установить объект = ноль

Вы можете использовать решение, подобное EventManagedSprite , которое использует EventRemover , чтобы немного упростить полное удаление объектов. Это также может быть полезно в больших проектах.

Если вы хотите повторно использовать спрайт / объект, но при повторном использовании вы хотите повторно использовать объекты, вы должны использовать пул объектов. Подробнее о объектном пуле с AS3 :

1 голос
/ 14 августа 2011

removeChild / removeChildAt удаляет DisplayObject из его родителя; он все еще остается в памяти, и вы можете добавить его позже, если хотите (если у вас есть ссылка на него).

По моему опыту, удаление removeChild + null - лучший способ удалить DisplayObject и сэкономить на памяти.

Приветствия

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