是否可以在Flash中完全平滑滚动(ActionScript 3)?在下面的测试中,我创建了一个由随机噪声组成的位图,然后定期向左移动它。我没有在后台运行繁重的任务。我正在寻找的是与1987年的Amiga 500相同的平滑度: - )
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();
}
}
}
“渲染代码”在我的计算机(2.4 GHz Mac)上运行时需要<1毫秒,但仍然会在一两帧时间内卡住这种移动,使得机芯看起来不稳定。
FPS在Flash中设置为30。我尝试使用“测试电影”和浏览器(Chrome)运行它。目标是Flash Player 11.2。我也试过调用e.updateAfterEvent()来强制重绘。我也玩过将延迟和FPS设置为稍微不同的值,但没有改善。
这与not smooth scrolling in AS3不同,因为我已经在使用BitmapData。此外,我尝试使用ENTER_FRAME事件而不是回答该问题时建议的计时器,但它没有帮助。
答案 0 :(得分:3)
使用计时器时,您将无法与帧速率完全同步。正如您所提到的,帧速率稍微波动,使您的计时器有时会在一帧中跳过两次或跳过一帧。为了确保与帧速率更加同步,您应该收听Event.ENTER_FRAME
事件。
一个例子:
this.addEventListener(Event.ENTER_FRAME, updateFrame);
⋮
function updateFrame(e:Event):void {
noiseBitmap.x--;
}
答案 1 :(得分:3)
我建议你试试Greensock的TweenLite。它是一个高度优化的引擎,可以通过代码进行各种补间,可用于AS2和AS3。你可以找到它here。
Walkietokyo的解决方案仍然基于框架,不会消除您遇到的问题。而是使用基于时间的动画(TweenLite实际实现)。有关详细信息,请参阅this article。