【发布时间】:2021-11-15 15:37:18
【问题描述】:
我正在使用画布绘制标记(在 SVG 中)数百次(有时是数千次)。画布大小为 300x300 像素,SVG 为 18x25 像素。
代码非常直接,我有一个 for 循环,我在画布上绘制标记:
drawNewTile = (canvas, points) => {
const drawn = {};
const context = canvas.getContext('2d');
if (points.length === 0) return;
for (let i = points.length; i -= 1;) {
const [x, y] = points[i];
if (!drawn[`${x}:${y}`]) {
drawn[`${x}:${y}`] = true;
this.drawMarker(context, x, y);
}
}
};
drawMarker = (context, x, y) => {
const x_ = Math.floor(x - this.MARKER_WIDTH / 2 + this.MAX_DIMENSION_OF_MARKER);
const y_ = Math.floor(y - this.MARKER_HEIGHT + this.MAX_DIMENSION_OF_MARKER);
context.drawImage(this.marker, x_, y_, this.MARKER_WIDTH, this.MARKER_HEIGHT);
};
我已经做了一些优化:比如for循环,只画那些没有画出来的点,使用整数坐标等等。
在那之后,我得到了一些不错的结果,但是我的页面在谷歌浏览器上有点卡住了。尽管如此,令我惊讶的是,在 Firefox 中它运行得非常快,就像,非常非常快。所以我用谷歌浏览器的性能标签做了一些挖掘,我发现我的代码使用了大量的 CPU,而且速度很慢。
我还发现了这个article,它说 Chrome 使用一些启发式方法来确定它是使用 CPU 还是 GPU 来绘制画布。
所以,我的问题是,如何在 Chrome 上强制使用 GPU?有没有我可以设置的标志或类似的东西?您还有其他方法可以加快绘图过程吗?
【问题讨论】:
-
在该示例中,Canvas 非常大,因此 Chrome 会自动选择使用 GPU。我的问题是,在我的示例中,Chrome 决定使用 CPU。我需要的是一种改变它并使用 GPU 的方法。
-
您可以通过调整浏览器窗口大小或使用开发工具来更改视图大小。在较小的尺寸下,它的运行似乎没有任何变慢。
-
添加
canvas.style.transform = "matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)";是否会进行更改。只是猜测。 -
不,它没有:(
标签: javascript google-chrome firefox html5-canvas gpu