2013-01-05 48 views
0

Flash中可以完全平滑滚动(ActionScript 3)吗?在下面的测试中,我创建了一个由随机噪声组成的位图,然后定期将它移动到左边。我没有在后台运行繁重的任务。我所寻找的是光滑度,这将是看齐我的Amiga 500从1987年:-)Flash AS3上的平滑滚动

package { 
    import flash.display.*; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 

    public class Game extends Sprite { 
     var noiseBitmap; 

     public function Game() { 
      var noiseBitmapData = new BitmapData(stage.stageWidth * 3, stage.stageHeight); 
      noiseBitmapData.noise(0, 0, 255, 7, true); 
      noiseBitmap = new Bitmap(noiseBitmapData); 
      addChild(noiseBitmap); 

      var t = new Timer(1000/30, 999999); 
      t.addEventListener("timer", function (e:TimerEvent) { 
       noiseBitmap.x--; 
      }); 
      t.start(); 
     } 
    } 
} 

的“渲染代码”需要< 1毫秒到我的电脑(2.4GHz的苹果机)上运行,但仍机芯偶尔会卡住一两帧,使机芯显得不平整。

Flash中的FPS设置为30。我试着用“测试电影”和浏览器(Chrome)来运行它。 Target是Flash Player 11.2。我也尝试调用e.updateAfterEvent()强制重绘。我也玩过将延迟和FPS设置为稍微不同的值,但没有改进。

这与not smooth scrolling in AS3不同,因为我已经使用了BitmapData。我也试着用ENTER_FRAME事件来代替计时器,正如在回答这个问题时所建议的那样,但它没有帮助。

+0

帧之间的延迟保持在31-34毫秒之间。 – Bemmu

+0

正如其他地方所回答的那样,您绝对应该使用ENTER_FRAME而不是定时器。但无论哪种方式,垃圾收集器都可能导致这种急躁行为。如果您还没有访问任何分析工具来诊断您的代码,Adobe Scout非常值得一看(免费)。 – 2013-01-14 23:43:59

回答

3

使用计时器时,您将不会与帧速率完全同步。正如你所提到的,帧速率有点波动,使得你的计时器有时会在一帧或两帧之间触发两次。为确保与帧速率保持同步,您应该听取Event.ENTER_FRAME事件。

一个例子:

this.addEventListener(Event.ENTER_FRAME, updateFrame); 

function updateFrame(e:Event):void { 
    noiseBitmap.x--; 
} 
+0

谢谢,但使用ENTER_FRAME不是一种改进。 – Bemmu

3

我建议你尝试GreenSock的TweenLite的。它是一个高度优化的引擎,可以通过代码进行各种补间并可用于AS2和AS3。你可以找到它here

Walkietokyo的解决方案仍然是基于框架的,并不会消除您遇到的问题。而应使用基于时间的动画(TweenLite实际实现该动画)。欲了解更多信息,请参阅this article