HTML5 Canvas 平移图像与裁剪的效率
HTML5 Canvas efficiency of panning image by Translate vs. Clipping
有很多关于在 canvas 中平移背景图像的问题(即在角色居中的游戏中模拟 'camera')- 大多数答案建议使用 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);
};
示例结果:fiddle
提前致谢!
使用 t运行sform 矩阵控制相机的主要优点是您不必更新世界中的所有元素,只需移动世界即可。
所以是的,如果您愿意只移动一个元素(如您的情况那样是背景),那么只移动那个元素可能是更好的选择。
但是如果你需要几层元素都相对于相机移动,那么使用t运行sformation matrix是更好的选择。
至于性能,我没有运行这方面的任何基准测试,但我怀疑它完全相同,但在弄乱 drawImage
的裁剪功能时要小心,在至少 .
有很多关于在 canvas 中平移背景图像的问题(即在角色居中的游戏中模拟 'camera')- 大多数答案建议使用 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);
};
示例结果:fiddle
提前致谢!
使用 t运行sform 矩阵控制相机的主要优点是您不必更新世界中的所有元素,只需移动世界即可。
所以是的,如果您愿意只移动一个元素(如您的情况那样是背景),那么只移动那个元素可能是更好的选择。
但是如果你需要几层元素都相对于相机移动,那么使用t运行sformation matrix是更好的选择。
至于性能,我没有运行这方面的任何基准测试,但我怀疑它完全相同,但在弄乱 drawImage
的裁剪功能时要小心,在至少