4

問題

キャンバス上の画像を左から右にスムーズに移動しようとしています。Chrome/Safari ではそれほど悪くはありませんが (まだ少しカクつきます)、複数のマシン (Windows と Mac で試した) の Firefox ではカクつきが目立ちます。私はこれを解決する方法について少し困惑しています。

私が試したこと

setTimeout の代わりに requestAnimationFrame を使用しています。キャンバス幅を設定する代わりに clearRect を使用していますが、最悪のシナリオでテストしたかったので、最小バウンディング ボックスではなくキャンバス全体をクリアしています。余分なタブを閉じました。Firebugも無効にしました。画像データ関数の代わりに drawImage を使用しています。clearRect と drawImage 以外は何もしていないので、オフスクリーン キャンバスの使用は避けました。

例 1: http://jsfiddle.net/QkvYs/

これにはフレームレートが設定されており、ゲームループの実行頻度に関係なく位置が正しいことが保証されます。スキップされたフレーム数を表示します。この例は、私が目指しているものに近いものです。フレームがスキップされていない場合でも、途切れ途切れに見えることに注意してください。約 30 fps (var frameRate = 33;) を目指したいのですが、フレームレートも試してみましたが、成功しませんでした。

例 2: http://jsfiddle.net/R8sEV/

これは、画像を移動するだけの簡単なものです。これは、複数のマシンで途切れます。

//loop
function loop() {
    //request anim frame
    requestAnimationFrame(loop);

    //set canvas once able
    if (!canvas) {
        var temp = document.getElementById("testCanvas");
        if (temp) {
            canvas = temp;
            ctx = canvas.getContext('2d');
        }
    }

    //update and render if able
    if (canvas) {
        //increase x
        x += 5;

        //start from beginning
        if (x > canvas.width) {
            x = 0;
        }

        //clear
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        //image
        ctx.drawImage(image, x, 200);
    }
}

//start
loop();

私が見たもの

この質問は以前に尋ねられたことを認識しており、質問する前に見ました。ただし、残念ながら、与えられた回答は役に立ちませんでした。

助けてくれてありがとう!それは有り難いです。

4

1 に答える 1

1

たとえば、位置計算で時間デルタを使用します。これにより、FPS やフレーム間の遅延に関係なく、オブジェクトが特定の時間内に特定の値だけ移動することが保証されます。

フィドルを編集しました: http://jsfiddle.net/R8sEV/2/

間違ったアプローチ:

x += 5

良いアプローチ:

x += speed * delta / 1000

ここで、デルタは最後のフレームから経過した時間 [ミリ秒] であり、速度は [ピクセル/秒] で測定されます。

于 2013-01-18T00:49:50.803 に答える