【问题标题】:Canvas efficiency when drawing many rectangles绘制多个矩形时的画布效率
【发布时间】:2013-05-13 02:28:27
【问题描述】:

我有一个从图像中的每个像素坐标派生的二维颜色数组。滑块确定像素化矩形的大小,图像以像素化形式重绘。在嵌套循环中,jCanvas 用于将每个“像素”绘制为一个矩形。在调整滑块和新的画布绘制之间有明显的减慢。可以做些什么来提高绘制许多画布矩形的效率?我希望在大于当前 250x250 的图像上使用这个概念,但前提是重绘效率更高。

当滑块值发生变化时,调用该函数:

$("canvas").clearCanvas();

for(var x = 0; x < colorMatrix.length; x += size) {
    for(var y = 0; y < colorMatrix[0].length; y += size) {
        $("canvas").drawRect({
            fillStyle: '#' + colorMatrix[x][y],
            x: (x), y: (y),
            width: size,
            height: size,
            fromCenter: false
        });
    }
} 

干杯, tL

【问题讨论】:

  • 你能提供一个jsfiddle吗?
  • jsfiddle.net/uXBN5 这是一个演示,缩小到更小的尺寸。

标签: jquery html canvas rect jcanvas


【解决方案1】:

仅通过缓存 $("canvas") 值,您将获得巨大的加速:

var canvas = $("canvas");
canvas.clearCanvas();

for(var x = 0; x < colorMatrix.length; x += size) {
    for(var y = 0; y < colorMatrix[0].length; y += size) {
        canvas.drawRect({
            fillStyle: '#' + colorMatrix[x][y],
            x: (x), y: (y),
            width: size,
            height: size,
            fromCenter: false
        });
    }
}

但如果你真的想提高性能,你应该使用draw method 并将你的整个循环放在那个函数中,这样你就可以使用原始的canvas 绘图API,它可以让你更快地绘制东西。

【讨论】:

  • 这是完美的。感谢您的提示!现在速度快很多了。
【解决方案2】:

你也可以从 DOM 中分离元素,应该优化性能:

http://jsfiddle.net/uXBN5/1/

function updatePixelatedImage(size) {
    var $tmp = $('<div/>').insertBefore('canvas'),
        $canvas = $('canvas').detach();
    $canvas.clearCanvas();

    for(var x = 0; x < colorMatrix.length; x += size) {
        for(var y = 0; y < colorMatrix[0].length; y += size) {
            $canvas.drawRect({
                fillStyle: '#' + colorMatrix[x][y],
                x: (x), y: (y),
                width: size,
                height: size,
                fromCenter: false
            });
        }
    } 

    $tmp.replaceWith($canvas);
}

【讨论】:

  • 也是个好主意。这与布兰登的回答相结合,将使整个解决方案的效率提高许多倍。谢谢!
  • @roasted 有趣...为什么分离画布可以提高性能?是否强制浏览器一次渲染所有矩形而不是一次渲染一个?令人惊讶的是没有更好的方法来做到这一点......
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多