没有办法使用纯 RGB,但可以通过删除重复计算、数组引用等来优化该代码中的循环。
一般来说,您不应该使用ctx.getImageData
来获取目标缓冲区 - 您通常不关心已经存在的值,ctx.createImageData
而是应该使用。如果可能的话,为每一帧重新使用相同的原始缓冲区。
但是,由于您想将 alpha 值预设为0xff
(它们默认为0x00
)并且只需要这样做一次,因此仅填充画布然后使用getImageData
.
ctx.fillStyle = '#ffffff'; // implicit alpha of 1
ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
dest = ctx.getImageData(0, 0).data
然后对于每一帧 for 可以保持 alpha 字节不变:
var n = 4 * w * h;
var s = 0, d = 0;
while (d < n) {
dest[d++] = src[s++];
dest[d++] = src[s++];
dest[d++] = src[s++];
d++; // skip the alpha byte
}
您还可以尝试“循环展开”(即在循环中多次重复这四个行块while
),尽管结果会因浏览器而异。
由于您的像素总数很可能是四的倍数,因此只需再重复该块 3 次,然后while
将仅对每四个像素副本进行评估。