javascript - Canvas 渲染不平滑

标签 javascript canvas

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

这是我的代码,每帧都会被调用:

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% 平滑,但我找不到解决方案。 有人知道为什么会发生这种情况吗?

最佳答案

这里有 3 个建议:

• 提前调用requestAnimationFrame:通过我的适度测试,表明当rAF 是第一个调用的函数时,事情会更顺利一些。很可能是因为它需要幕后工作才能发挥作用。尝试一下!
• 使用drawImage 时,坐标将为您舍入:您可能想要自己进行舍入,因为使用的是“floor”,而“ceil”可以提供更平滑的结果。
• 最重要的是,您正在使用DOM(div 等)来显示鼠标位置/fps。不要这样做。在 Canvas (或其他一些可见的 Canvas )上使用 fillText,因为您无法确定更改这些值时会导致回流/重绘。

关于javascript - Canvas 渲染不平滑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24437786/

相关文章:

javascript - 单击 HTML5 Canvas

android - 在android中合并两个位图

javascript - 使用 Canvas 在 promise 内裁剪图像不起作用

javascript - 加载时 Canvas 图像不显示

javascript - 当 setInterval() 运行另一个函数时,一个有效的函数突然变为 "not a function"

javascript - 来自 mongodb 的 Angular GET 返回 [object Object]

javascript - AngularJS - Controller 中的参数绑定(bind)

javascript - 按钮不调用 onClick (html)

javascript - 将单击的元素的 ID 作为类名分配给另一个元素

javascript - HTML Canvas 留下不需要的痕迹