4

问题

我试图让画布上的图像从左到右顺利移动。在 Chrome/Safari 上还不错(仍然有点卡顿),但在多台机器上的 Firefox 中存在明显的卡顿(在 Windows 和 Mac 上试过)。我对如何解决这个问题有点困惑。

我尝试了什么

我正在使用 requestAnimationFrame 而不是 setTimeout。我正在使用 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

For instance use time delta in your position calculations. This will ensure that object is moved by certain value in given time regardless of FPS and delay between frames.

Edited your fiddle: http://jsfiddle.net/R8sEV/2/

wrong approach:

x += 5

good approach:

x += speed * delta / 1000

where delta is time in [ms] which passed from last frame - and speed is measured in [pixels/second]

于 2013-01-18T00:49:50.803 回答