Сделать таймеры доступными для GC? - PullRequest
1 голос
/ 05 декабря 2011

В функции, которая создает новый таймер каждый раз, когда он вызывается, это правильный способ избавиться от него?

private var _timers:Vector.<Timer> = new Vector.<Timer>;
private var _timer:Timer

private function timer():void
{
    _timer = new Timer(10000, 1);
    _timers.push(_timer);
    _timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimer, false,0,true);
    _timer.start();
}

private function onTimer(e:TimerEvent):void
{
    e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimer);
    _timers[0] = null;
    _timers.shift();
}

Ответы [ 3 ]

1 голос
/ 19 мая 2012

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

public static var timer_stack:Vector.<Timer> = new Vector.<Timer>();

public static function delay(delaytime:Number, func_name:Function, repeat:Number = 1)
{
    var timer:Timer = new Timer(delaytime, repeat);
    timer_stack.push(timer);    
    timer_stack[timer_stack.length-1].addEventListener(TimerEvent.TIMER, func_name ,false,0,true);
    timer_stack[timer_stack.length-1].addEventListener(TimerEvent.TIMER_COMPLETE,
                   function(e:TimerEvent){ delay_complete(e, func_name); });
    timer_stack[timer_stack.length-1].start();
}

public static function delay_complete(e, func_name:Functio):void
{
    e.target.stop();
    e.target.removeEventListener(TimerEvent.TIMER, func_name);
    timer_stack[timer_stack.length-1].removeEventListener(TimerEvent.TIMER_COMPLETE, 
                    function(){ func_name_complete(e, func_name);} );

    for(var i=0; i < timer_stack.length; i++)
    {
        if(timer_stack[i].running == true)
            trace("timer @ "+i+" is running");

        if(timer_stack[i].running == false)
        {
            timer_stack[i] = null;
            timer_stack.splice(i,1);
            trace("remove timer @ "+i);
        }
    }
}
1 голос
/ 20 мая 2012

На случай, если время по какой-либо причине изменится, лучше иметь дело с объектом напрямую, а не предполагать, что объект Timer имеет индекс 0.

Требуется небольшая настройка для onTimer():

private function onTimer(e:TimerEvent):void
{
    var timer:Timer = e.currentTarget as Timer;

    timer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimer);
    _timers.splice(_timers.indexOf(timer), 1);
}

Вам не нужно устанавливать индекс на null, и никогда не стоит полагать, что ваш товар будет по указанному индексу, всегда проверяйте. В этом случае вы должны убедиться, используя метод indexOf(), доступный в объекте типа Array (_ таймеры) .

Надеюсь, это поможет.

1 голос
/ 05 декабря 2011

Может быть, вы можете добавить

_timers[0].stop();
...