【问题标题】:HTML5 Canvas efficiency of panning image by Translate vs. Clipping通过 Translate 与 Clipping 平移图像的 HTML5 Canvas 效率
【发布时间】:2021-05-16 20:40:26
【问题描述】:

有很多关于在画布中平移背景图像的问题(即在游戏中以角色为中心模拟“相机”) - 大多数答案建议使用画布的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);
};

示例结果:fiddle

提前致谢!

【问题讨论】:

  • 你说得对,我以前的解决方案只适用于静态图像,我已经删除了它。

标签: javascript performance html5-canvas drawimage pan


【解决方案1】:

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

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

至于性能,我没有对此进行任何基准测试,但我怀疑它是完全相同的,但在弄乱drawImage 的裁剪功能时要小心,至少Safari doesn't handle cropping from outside of a source canvas correctly

【讨论】:

  • 太好了 - 谢谢!是的,对于其他元素,我使用单独的画布,所以听起来我应该没问题
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2016-05-10
  • 2014-05-28
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多