无法使用纯 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
然后对于每个帧,可以只保留 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
循环),但不同浏览器的结果会有所不同。
由于您的像素总数很可能是四的倍数,因此只需再重复该块三次,然后while
仅对每四个像素副本进行评估。