画布渲染不流畅

时间:2014-06-26 18:36:24

标签: javascript canvas

由于某种原因,我的渲染有时会断断续续。正如你在这里看到的那样(http://sirius-btx.com/test/)。 使用箭头键移动。 底部画布仅预渲染一次,然后每帧都会在主上部画布上绘制预渲染。

以下是每个帧调用的代码:

var tick = (function() {
    var lastTimestamp = 0;

    return function(timestamp) {
        dt = (timestamp - lastTimestamp) / 1000;
        lastTimestamp = timestamp;

        ctx.fillStyle = "black";
        ctx.fillRect(0, 0, self.resolution.width, self.resolution.height);

        var cameraPosition = camera.position;
        if(keys[37]) {
            cameraPosition.x -= 10 * dt;
        }
        if(keys[38]) {
            cameraPosition.y -= 10 * dt;
        }
        if(keys[39]) {
            cameraPosition.x += 10 * dt;
        }
        if(keys[40]) {
            cameraPosition.y += 10 * dt;
        }

        camera.position = cameraPosition;

        var tileSet = self.resource.get("tiles");

        ctx.save();
        // mapCamera starts at the same position as camera.
        // So (mapCamera.position - camera.position) is the offset we have to move.
        ctx.translate((mapCamera.position.x - camera.position.x) * 16, (mapCamera.position.y - camera.position.y) * 16);
        // mapCanvas is the prerendered canvas.
        ctx.drawImage(mapCanvas, -16, -16, self.resolution.width + 32, self.resolution.height + 32);
        ctx.restore();

        requestAnimationFrame(tick);
    };
})();

我一直试图弄清楚为什么它不是100%顺利,但我无法找到解决方案。 有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

这里有3条建议:

•调用早期的requestAnimationFrame:通过我的适度测试,它表明当rAF是第一个被调用的函数时,事情会更平滑。很可能是因为它需要幕后工作才能开始工作。试试吧!
 •使用drawImage时,坐标将为您舍入:您可能希望自己进行舍入,因为它是“地板”。那是用的,那个' ceil'这样可以获得更平滑的结果  •最重要的是,您使用DOM(div或类似物)来显示鼠标位置/ fps。不要这样做。在画布上(或在其他可见画布上)使用fillText,因为在更改这些值时无法确定是否会导致重排/重绘。