【问题标题】:Smooth scrolling on Flash AS3Flash AS3 上的平滑滚动
【发布时间】:2013-01-05 11:03:49
【问题描述】:

是否可以在 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 毫秒,但移动偶尔仍会卡住一两帧,使移动显得生涩。

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

这与not smooth scrolling in AS3 不同,因为我已经在使用 BitmapData。我也尝试过使用 ENTER_FRAME 事件而不是在回答该问题时建议的计时器,但它没有帮助。

【问题讨论】:

  • 帧之间的延迟保持在 31 - 34 毫秒之间。
  • 正如在其他地方回答的那样,您绝对应该使用 ENTER_FRAME 而不是计时器。但无论哪种方式,抖动都可能是由垃圾收集器运行引起的。如果您还没有任何分析工具来诊断您的代码,Adobe Scout 非常值得一看(而且免费)。

标签: actionscript-3 flash bitmapdata


【解决方案1】:

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

一个例子:

this.addEventListener(Event.ENTER_FRAME, updateFrame);

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

【讨论】:

  • 谢谢,但使用 ENTER_FRAME 并没有改善。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多