【发布时间】:2011-04-27 14:15:59
【问题描述】:
我正在开发一款游戏,但在使用 drawImage 将一个画布绘制到另一个画布上时遇到了一些性能问题。根据 Chrome 的 Profiler,我将 60% 的时间花在这个 drawImage 调用上,而 10% 的时间花在它上面的 clearRect...
源画布现在大约是 3000x3000(我会说这非常小),目标画布是 1024x768。
我想这不是画所有的瓷砖;墙壁等等等等每个循环(给我大约15fps),将它们全部绘制到屏幕外画布上然后将其绘制到我的主画布上,然后在顶部绘制实体等可能会更快.这给了我大约 30 fps 但......这是我将通过软件渲染获得的最佳效果吗?
我的渲染循环基本上是:
ctx.clearRect(0, 0, 1024, 768);
ctx.beginPath();
ctx.drawImage(map, cam.position.i, cam.position.j, 1024, 768, 0, 0, 1024, 768);
ctx.closePath();
ctx.save();
ctx.translate(-cam.position.i, -cam.position.j);
// draw entities, etc.
ctx.restore();
除了开始使用 WebGL(利用其硬件加速)或等待供应商为 2d 上下文实施硬件加速之外,我真的想不出该怎么做。不过,我宁愿不这样做,所以任何意见都将不胜感激。
【问题讨论】:
-
我不确定 beginPath 和 closePath 是否适用于 drawImage。
-
啊,我一直将它们用于带有 lineTo/moveTo 和 drawImage 的路径。我刚刚删除了它们,帧速率大致相同,但还是谢谢。
-
3000x3000 是巨大的,即使是 1024x768 的软件渲染也已经很慢了,或者它耗尽了它可以获得的所有 CPU,根据我的经验,在硬件加速完全到达之前你无能为力。不过,您可能会考虑对基于图块的游戏使用基于 HTML 的方法。
标签: javascript performance html canvas