0

是否可以在 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 设置为略有不同的值,但没有任何改善。

这与AS3 中的不平滑滚动不同,因为我已经在使用 BitmapData。我也尝试过使用 ENTER_FRAME 事件而不是计时器,如对该问题的回复中所建议的那样,但它没有帮助。

4

2 回答 2

3

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

Walkietokyo 的解决方案仍然是基于框架的,不会消除您遇到的问题。而是使用基于时间的动画(TweenLite 实际实现)。有关详细信息,请参阅这篇文章

于 2013-01-05T17:15:58.317 回答
3

使用计时器时,您不会与帧速率完全同步。正如您所提到的,帧速率略有波动,使您的计时器有时会在一帧内触发两次或跳过一帧。为了确保与帧速率更加同步,您应该收听该Event.ENTER_FRAME事件。

一个例子:

this.addEventListener(Event.ENTER_FRAME, updateFrame);

⋮</p>

function updateFrame(e:Event):void {
    noiseBitmap.x--;
}
于 2013-01-05T11:43:08.670 回答