【问题标题】:Optimizing setting of pixels in HTML5 canvas优化 HTML5 画布中的像素设置
【发布时间】:2013-01-08 18:58:43
【问题描述】:

HTML5 Canvas 没有明确设置单个像素的方法。

目前我知道的解决方案是:

  • 使用getImageDataputImageData,但是动画效率太低 由于putImageData的性能低下

  • 使用像rectputImageData这样的重物来绘制单个像素,但是当有很多像素要绘制时,性能似乎要差得多。

我看到drawImage 函数确实比putImageData 快 事实上,如果我们用drawImage(new Image(w,h)) 替换putImageData,它真的很快。 但是我不知道任何解决方案可以将图像放在drawImage 的参数上,可以快速逐个像素地设置。

她是一个慢代码的例子

HTML:

<canvas id="graph1" width="1900" height="1000"></canvas>

Javascript:

    var canvas=document.getElementById("graph1"),
        ctx=canvas.getContext("2d"),
        imageData,
        data,
        w=canvas.width,
        loop=0,
        t=Date.now();

    window.requestAnimFrame = (function(callback) {
        return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
        function(callback) {
          window.setTimeout(callback, 1000 / 60);
        };
      })();


    function animate() {
        imageData=ctx.createImageData(w, canvas.height);
        data=imageData.data;
        for(i=0;i<30000;i++) { // Loop fast enough
            x=Math.round(w*Math.random());
            y=Math.round(canvas.height*Math.random());   
            data[((w * y) + x) * 4]=255;
            data[((w * y) + x) * 4+1]=0;
            data[((w * y) + x) * 4+2]=0;
            data[((w * y) + x) * 4+3]=255;
        }
        ctx.putImageData(imageData, 0, 0); //Slow
        //ctx.drawImage(new Image(canvas.width, canvas.height),0,0);// Would be about 4x faster even if ImageData would be also blank

        requestAnimFrame(function() {
                loop++;
                if(loop<100)
                    animate();
                else
                    alert('finish:'+(Date.now()-t));
            });
    }
    animate();

如果有人有提高性能的线索。

【问题讨论】:

  • 您是否尝试使用 fillRect (x,y,1,1) 放置像素??
  • 浏览器可能在我写此消息后已经进化,但当时我测试使用 rect 对象,它比任何解决方案都要糟糕。

标签: javascript html5-canvas pixel-manipulation


【解决方案1】:

putImageData 是您想要使用的,(如果您计划使用 html5 画布)。它和drawImage 一样快。

如果 drawImageputImageData 方法具有相似的图像并重新绘制,则它们最终的速度相同。您正在将完全随机像素的重绘速度与一遍又一遍地重绘空白进行比较。如果您需要证明这一点,我可以举个例子。

【讨论】:

  • 我完全不确定。你可以看看jsperf.com/bufferingdrawImageputImageData 快大约 100 倍。在我的示例中,将ctx.putImageData(...) 行替换为ctx.drawImage(...) 行,您会看到即使对于空白图像,脚本也更快(在此示例中仅快4 倍,但它足以提高动画的流畅度) .浏览器针对drawImage而不是putImageData优化的方式确实很奇怪
  • jsfiddle.net/DEw3b/1 有趣的是,这在我的一台计算机上是相等的,但在另一台计算机上却不是。无论如何,你不能用draw来做单个像素。所以这不是那么重要。
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多