2

我试图创建一些蓝色波浪,但如果我运行它,浏览器就会释放。仅当我将画布的大小减小到 80 和 60 时,它才有效。

<canvas id="canvas" width="800" height="600"></canvas>

脚本:

var canvas=document.getElementById('canvas'), ctx = canvas.getContext('2d');
var imageData = ctx.createImageData(canvas.width, canvas.height);

for(var i=0; i<imageData.width; i++) {
    for(var j=0; j<imageData.height; j++) {
        imageData.data[((imageData.width * j) + i) * 4] = 0;
        imageData.data[((imageData.width * j) + i) * 4+1] = 0;
        imageData.data[((imageData.width * j) + i) * 4+2] = 127*Math.sin(i/100)+128;
        imageData.data[((imageData.width * j) + i) * 4+3] = 255;
        ctx.putImageData(imageData, 0, 0);
    }
}

我错了什么?为什么这么慢?

4

3 回答 3

3

主要的减速是因为您在每次迭代时都在绘制图像。

移动这条线

ctx.putImageData(imageData, 0, 0);

在你的循环之外。

于 2013-03-11T17:02:40.643 回答
2

查看疯狂的快速测试:http: //jsfiddle.net/powtac/t8JA2/8/

    imageData.data[((imageData.width * j) + i) * 4] = 0;
    imageData.data[((imageData.width * j) + i) * 4+1] = 0;
    imageData.data[((imageData.width * j) + i) * 4+2] = 127*Math.sin(i/100)+128;
    imageData.data[((imageData.width * j) + i) * 4+3] = 255;

可以写成:

    tmp = ((imageData.width * j) + i) * 4;
    imageData.data[tmp] = 0;
    imageData.data[tmp + 1] = 0;
    imageData.data[tmp + 2] = 127*Math.sin(i/100)+128;
    imageData.data[tmp + 3] = 255;

我还包括了 not_john 将繁重的任务移出循环的想法。

于 2013-03-11T16:52:22.067 回答
1

它缓慢的一个原因是因为您正在冗余地执行某些计算。

var value = (imageData.width * j) + i); // <--- cache this value

保存属性查找

for(var j=0, k=imageData.height; j<k; j++) {
于 2013-03-11T16:49:51.687 回答