加快HTML5画布元素上的许多点的绘制

Nic*_*las 11 html javascript canvas html5-canvas

我需要在HTML5画布上绘制很多点,这需要很长时间.我的代码看起来像这样:

var points = getPoints() // Array of {x,y,color}
var ctx = canvas.getContext("2d");

for (var i = 0; i < points.length; i++) {
   ctx.fillStyle = points[i].color
   ctx.beginPath()
   ctx.arc(points[i].x, points[i].y, radius, 0, Math.PI * 2, true)
   ctx.fill() }
Run Code Online (Sandbox Code Playgroud)

我想知道我可以采取哪些性能调整来加快速度.我只有5种不同的颜色.例如,我是否有利于表格排序点列表即时更改ctx.fillStyle只有5次而不是每点一次?

Aln*_*tak 13

例如,我是否有利于动态排序点列表,只改变ctx.fillStyle 5次,而不是每点一次?

根据我的经验,是的 - .fillStyle频繁更换非常昂贵.

我的代码在画布上绘制了大量的矩形,并且绘制只有两种不常变化颜色的矩形的时间明显好于使用许多频繁变化的颜色绘制.

无论如何,因为你只有五种不同的颜色:

  1. 创建一个离屏画布,您可以在其中绘制五个圆圈
  2. 用于.drawImage()将正确的色环blit到目标画布中,而无需重新计算弧坐标
  3. 分配points[i]给循环内的局部变量,以避免反复取消引用它.

在我的笔记本电脑上,此代码在7毫秒内在400x400画布上绘制3000个圆圈:

var colours = ['red', 'green', 'blue', 'yellow', 'magenta'];
var n = colours.length;
var r = 10;
var d = r * 2;

var off = document.createElement('canvas');
off.width = n * d;
off.height = d;
var ctx = off.getContext('2d');  

for (var i = 0; i < n; ++i) {
    ctx.fillStyle = colours[i];
    ctx.beginPath();
    ctx.arc(i * d + r, r, r, 0, 2 * Math.PI);
    ctx.closePath();
    ctx.fill();
}

var canvas = document.getElementById('canvas');
var ctx2 = canvas.getContext('2d');
var t0 = Date.now();
for (var i = 0; i < 3000; ++i) {
    var c = Math.floor(n * Math.random());
    var x = Math.floor(canvas.width * Math.random());
    var y = Math.floor(canvas.height * Math.random());
    ctx2.drawImage(off, c * d, d, d, x - r, y - r, d, d);
}
var t1 = Date.now();
alert((t1 - t0) + "ms");
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/alnitak/Dpgts/