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

时间:2012-12-17 14:30:45

标签: javascript html 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() }

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

1 个答案:

答案 0 :(得分:13)

  

例如,我是否有利于表单快速排序点列表以仅更改ctx.fillStyle 5次而不是每点一次?

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

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

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

  1. 创建一个可以绘制五个圆圈的离屏画布
  2. 使用.drawImage()将正确的色圈显示到目标画布中,而无需重新计算圆弧坐标
  3. points[i]分配给循环内的局部变量,以避免反复引用它。
  4. 在我的笔记本电脑上,此代码在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");
    

    请参阅http://jsfiddle.net/alnitak/Dpgts/