4

我正在编写一个游戏,它以以下方式在屏幕顶部显示分数:

    canvasContext.fillStyle = "#FCEB77";
    canvasContext.fillText('  Score: ' + Math.floor(score) + '  Lives: ' + Math.floor(lives) + ' other info: ' + Math.floor(otherInfo));

哪个工作正常。然后我想做的是在该文本周围画一个框;所以我尝试了以下方法:

    canvasContext.rect(2, 1, 210, 30);
    canvasContext.rect(2, 1, 80, 30);
    canvasContext.rect(80, 1, 70, 30);
    canvasContext.strokeStyle = "#FCEB77";
    canvasContext.stroke();

当我运行游戏时,性能的影响令人难以置信。我每帧都清除整个画布,但绘制三个矩形似乎会影响性能。谁能告诉我为什么,以及如何解决这个问题?

4

1 回答 1

9

现场演示

尝试添加beginPath方法,如以下代码:

canvasContext.beginPath();
canvasContext.rect(2, 1, 210, 30);
canvasContext.rect(2, 1, 80, 30);
canvasContext.rect(80, 1, 70, 30);
canvasContext.strokeStyle = "#FCEB77";
canvasContext.stroke();
canvasContext.closePath();

使用路径绘图时,您使用的是虚拟“笔”或“指针”。没有路径,会导致画布状态机的直接变化,这会使事情变慢。

closePath在这种情况下并不是真正需要的,但可以用来说明用法。

尝试使用和不使用(开始/关闭)路径的演示并比较性能。我提供了一个粗略的 fps 计数器,但足以看到性能下降。

您可能需要在其他浏览器(包括手机)上检查这一点,所以我设置了这个JSPerf 测试

于 2013-05-20T21:27:38.510 回答