События таймера засоряются и запускаются одновременно в AS3 - PullRequest
1 голос
/ 06 июля 2010

Я сталкиваюсь с этой проблемой во многих формах.

public function startTimer() {
  timer = new Timer(3000);
  timer.addEventListener(TimerEvent.TIMER, timerTick, false, 0, true);
  timer.start();
}

private function timerTick(e:TimerEvent) {
  var bubble = new Bubble();
  this.addChild(bubble);
}

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

Если окно флэш-памяти оставалось бездействующим в течение примерно 20 минут, тогда слишком много объектов Bubbleсоздан и показан на дисплее.На экране должно быть только около 5 (потому что они удалены), но их слишком много.

Я думаю, по какой-то причине события таймера засоряются, и когда мы возвращаемся в окно браузера, всесрабатывает сразу.Это использует Firefox на Mac, но также происходит и в других браузерах.

Я пробовал много вещей, включая переписывание таймеров с помощью flash.utils.getTimer () (т.е. с использованием системных часов) и использованиерекурсивный TweenLite.delayedCall.

Спасибо за любые советы и указатели

1 Ответ

0 голосов
/ 06 июля 2010

Я думаю, что вы столкнулись с новой функцией в Flash Player 10.1, где она снижает скорость воспроизведения до 2FPS, когда контент полностью невидим (т.е. когда пользователь переключает вкладки или прокручивает контент за пределами экрана). Инженер Adobe объясняет это здесь .

Так что я предполагаю, что ваши пузыри движутся и удаляются на основе кадровой анимации или событий. Поэтому, когда происходит такое замедление, они начинают двигаться гораздо медленнее, чем скорость их появления. (Даже при ограниченном воспроизведении события таймера работают примерно одинаково - вероятность их возникновения наступает реже, но каждое событие по-прежнему происходит при первой возможности через три секунды после последней.)

Таким образом, любой контент, который сочетает в себе поведение на основе кадров и времени, будет работать по-разному в 10.1, когда пользователь меняет вкладки, что в конечном итоге необходимо для сохранения производительности и заряда батареи на устройствах. Лучшее решение состоит в том, чтобы, вероятно, изменить ваши таймеры на какую-то логику на основе фреймов, например:

public function startTimer() {
    frameCount = 0;
    addEventListener( Event.ENTER_FRAME, onFrame, false, 0, true);
}

private function onFrame(e:Event) {
    frameCount++;
    if (frameCount > waitTimeSeconds * publishedFPS) {
        frameCount = 0;
        timerTick();
    }
}

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

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