HTML5画布没有明确设置单个像素的方法。优化HTML5画布中像素的设置
我知道到目前为止,解决的办法是:
使用
getImageData
和putImageData
但效率太低,动画 由于putImageData
使用重物放像
rect
或低性能putImageData
来绘制单个像素,但是当有很多像素绘制时性能似乎更差。
我已经看到了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)放置像素吗? – GameAlchemist
自从我写下这条消息以来,浏览器可能已经发展了,但是在我测试使用rect对象的时候,它比任何解决方案都差得多。 – Hentold