首页 > 解决方案 > 通过 Translate 与 Clipping 平移图像的 HTML5 Canvas 效率

问题描述

关于在画布中平移背景图像有很多问题(即在游戏中以角色为中心模拟“相机”) - 大多数答案建议使用画布translate方法。

但是既然你必须在每一帧中重新绘制图像,为什么不直接剪辑呢?在效率方面重要吗?

特别是,像这样平移是一个坏主意吗?(此示例显示了相机在一个方向上移动的简化平移)

let drawing = new Image();
drawing.src = "img_src";
drawing.onload = function () {

    ctx.drawImage(drawing, 0, 0);
    let pos = 0
    
    setInterval(() => {
        pos += 1
        ctx.clearRect(0, 0, cnvs.width, cnvs.height);
        ctx.drawImage(drawing, -pos, 0 ); // "pans" the image to the left using the option `drawImage` parameters `sx` and `sy`
    }, 33);
};

示例结果:小提琴

提前致谢!

标签: javascriptperformancehtml5-canvasdrawimagepan

解决方案


使用变换矩阵来控制相机的主要优点是您不必更新世界中的所有元素,只需移动世界即可。

所以是的,如果您只愿意移动一个元素(就像您的情况一样是背景),那么只移动那个元素可能是一个更好的选择。
但是如果您需要几层元素都相对于相机移动,那么使用变换矩阵是更好的选择。

至于性能,我没有对此进行任何基准测试,但我怀疑它是完全相同的,尽管在弄乱 的裁剪功能时要小心drawImage,至少Safari 不能正确处理来自源画布外部的裁剪.


推荐阅读