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 ミリ秒未満かかりますが、それでも動きが 1 ~ 2 フレーム停止し、動きがぎくしゃくしたように見えます。

FPS は Flash で 30 に設定されています。「テストムービー」とブラウザ(Chrome)の両方で実行してみました。ターゲットは Flash Player 11.2 です。また、再描画を強制するために e.updateAfterEvent() を呼び出してみました。また、遅延と FPS をわずかに異なる値に設定して遊んでみましたが、改善はありません。

これは、既に BitmapData を使用しているため、AS3 での非スムーズ スクロールとは異なります。また、その質問への返信で提案されているように、タイマーの代わりに ENTER_FRAME イベントを使用してみましたが、役に立ちませんでした。

4

2 に答える 2

3

タイマーを使用する場合、フレーム レートと正確に同期しません。おっしゃるとおり、フレーム レートが少し変動するため、タイマーが 1 フレーム中に 2 回起動したり、フレームをスキップしたりすることがあります。フレームレートとより確実に同期するには、Event.ENTER_FRAMEイベントをリッスンする必要があります。

例:

this.addEventListener(Event.ENTER_FRAME, updateFrame);

⋮</p>

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

Greensock の TweenLite を試してみることをお勧めします。コードを介してあらゆる種類のトゥイーンを実行するために高度に最適化されたエンジンであり、AS2 および AS3 で使用できます。ここで見つけることができます。

Walkietokyo のソリューションは依然としてフレーム ベースであり、遭遇した問題を排除することはできません。代わりに、時間ベースのアニメーション (TweenLite が実際に実装) を使用します。詳細については、この記事を参照してください。

于 2013-01-05T17:15:58.317 に答える