PDA

Просмотр полной версии : Проблема с созданием и удалением обьектов


windrunner31
27.10.2011, 22:53
Я поставил FlashPreloadProfiler и из интереса решил поглядеть,что там у меня с быстродействием?
И заметил,что во вкладке MemoryProfiler,скапливаются экземпляры разнообразных классов,которые я вроде-бы обнуляю,и вот возник вопрос - как правильно обнулить экземпляры класса,чтобы они удалялись окончательно?
Просто у меня в этой же игре возникают тормоза и я думаю,что это,возможно из-за этого.
К примеру вот эта функция:
public class TimedAnimation
{
private var mv:MovieClip;
private var t:Timer;
private var tf:int; // totalFrames
private var f:Function;
public function TimedAnimation(mv:MovieClip,f:Function,sf:int = 1, ef:int = 0 )
{
if (ef == 0)
{
ef = mv.totalFrames;
}
this.tf = ef;
this.mv = mv;
this.f = f;
t = new Timer(25)
t.addEventListener(TimerEvent.TIMER, onTimerTick);
t.start();
}

private function onTimerTick(e:TimerEvent):void
{
mv.nextFrame();
if (mv.currentFrame == tf)
{
t.stop();
t.removeEventListener(TimerEvent.TIMER, onTimerTick);
f(mv);
t = null;
mv = null;
f = null;
}
}

}
Вызываемая таким образом:

private var Animator:TimedAnimation;
Animator = new TimedAnimation(mv3, onAnimationComplete);

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

in4core
28.10.2011, 00:31
в аниматоре сделать destroy() { снятие слушателя с таймера, остановка таймера, удалить ссылку на мувик, удалить ссылку на функцию }

вызвать
Animator.destroy();
Animator = null;

windrunner31
28.10.2011, 16:46
В коде я также делаю,только без отдельного метода

goodguy
28.10.2011, 17:28
Все правильно. Просто это не удаляет экземпляры сразу. Их удалит сборщик мусора, когда посчитает это нужным. Так что ничего удивительного, все работает как и должно

windrunner31
28.10.2011, 17:56
Ага,спасибо.

DCH
01.11.2011, 18:42
В дебажверсии можно руками вызвать сборщик и глянуть, что после этого останется.