javascript - 通过 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);
};
示例结果:小提琴
提前致谢!
解决方案
使用变换矩阵来控制相机的主要优点是您不必更新世界中的所有元素,只需移动世界即可。
所以是的,如果您只愿意移动一个元素(就像您的情况一样是背景),那么只移动那个元素可能是一个更好的选择。
但是如果您需要几层元素都相对于相机移动,那么使用变换矩阵是更好的选择。
至于性能,我没有对此进行任何基准测试,但我怀疑它是完全相同的,尽管在弄乱 的裁剪功能时要小心drawImage
,至少Safari 不能正确处理来自源画布外部的裁剪.
推荐阅读
- c# - 将 Firebase Admin SDK 添加到 Unity 项目
- postgresql - 在多个电子邮件字段中查找重复项
- c# - 确定基类中的泛型类型
- dax - DAX - 虚拟表中的参考列
- javascript - 如何使用 javascript(文件是本地文件)从一个 HTML 文件重定向到另一个?
- python - 是否可以从熊猫编写 Excel 数据透视表对象?
- python - 在 QML 窗口中使用 Python 创建 Google 日历事件
- reactjs - 反应路由器测试从非家庭开始
- python - 尝试在 python 中保存文件时如何解决此 I/O 错误?
- java - 自定义例外,多少算太多?