Flash 计时器事件在AS3中被阻塞并一次触发

Flash 计时器事件在AS3中被阻塞并一次触发,flash,actionscript-3,timer,Flash,Actionscript 3,Timer,我在很多方面都遇到过这个问题 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.addChil

我在很多方面都遇到过这个问题

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);
}
气泡在一定时间后从显示器上移除。想象一个水泡从屏幕底部向上漂浮,当到达顶部时,水泡被移除

如果flash窗口闲置约20分钟,则会创建太多气泡对象并在显示屏上显示。屏幕上应该只有大约5个,因为它们被删除了,但是太多了

我认为由于某种原因,计时器事件会被阻塞,当我们回到浏览器窗口时,所有事件都会立即触发。这是在mac上使用firefox,但在其他浏览器中也会发生

我尝试过很多事情,包括使用flash.utils.getTimer ie使用系统时钟重写计时器,以及使用递归TweenLite.delayedCall


感谢您提供的任何提示和提示

我认为您与Flash Player 10.1中的一项新功能有冲突,即当内容完全不可见时,即当用户切换选项卡或将内容滚动到屏幕外时,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();
    }
}

当然,您也可以将气泡更改为完全在计时器上工作,但这只意味着当内容位于不可见的选项卡上时,每一帧都会有一大堆计时器事件浪费处理周期。

你能发布删除气泡的代码吗?因为看起来你在创建局部变量,除了父级显示列表中的引用之外,没有其他引用;你是如何移除它们的?嘿,谢谢你的提示和油门行为的链接。我现在使用的代码是ENTER_FRAME和flash.utils.getTimer,它的性能比Timer好,但仍然会在20-30分钟左右变慢。我现在分析正在运行的函数。似乎没有内存泄漏。计时器上调用的函数最多需要2毫秒。内存每几秒钟从40MB变为50MB。也许有一些问题,GC被触发的次数太多了。你是说你仍然会有一大堆气泡,而不是一次只有5个或更多?如果是这样,那么您可能需要删除getTimer的使用,或者考虑节流。