AS3: значительное замедление - PullRequest
0 голосов
/ 11 августа 2011

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

Как можно проверить наличие таких проблем, как утечки памяти? И каковы хорошие стандарты программирования AS3 на этот счет?

Ответы [ 2 ]

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

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

Вот некоторые основные вещи, которые вы хотите охватить при правильном отбрасывании мувиклипа (или любого другого объекта):

  1. Удалить объект из DisplayList (если это DisplayObject). Это делается через то, что вы уже делаете, removeChild()
  2. Удалите все прослушиватели событий, которые были применены к Объекту. Лучшее, что можно сделать, - это быть в курсе этого с самого начала; под этим я подразумеваю, что когда вы звоните addEventListener(), обязательно где-нибудь в самом ближайшем будущем добавьте также сестру removeEventListener().
  3. Удалить ссылку на ваш объект. Это включает в себя, но не ограничивается: ссылка на Объект, являющаяся частью массива / вектора, ссылка, хранящаяся в свойстве другого объекта и т. Д.

Я могу предложить в базовом классе ваших объектов метод, который обрабатывает все это, например, remove() или deconstruct().

Вот пример:

public function deconstruct():void
{
    if(parent)
        parent.removeChild(this);

    removeEventListener(MouseEvent.CLICK, _onClick);
}

А когда вы расширяете этот класс и нуждаетесь в других функциях разыменования, просто используйте метод deconstruct():

override public function deconstruct():void
{
    removeEventListener(MouseEvent.MOUSE_OVER, _mouseOver);

    var i:int = someArray.indexOf(this);
    someArray.splice(i, 1);

    super.deconstruct();
}
1 голос
/ 11 августа 2011
...