Warum setzt HTML5 die CanvasPixelArray-Werte lächerlich langsam und wie kann ich das schneller machen?

Ich versuche, mithilfe der Pixelmanipulation der HTML 5-Zeichenfläche einige dynamische visuelle Effekte zu erzielen, stoße jedoch auf ein Problem, bei dem das Festlegen von Pixeln im CanvasPixelArray lächerlich langsam ist.

Zum Beispiel, wenn ich Code habe wie:

imageData = ctx.getImageData(0, 0, 500, 500);

for (var i = 0; i < imageData.length; i += 4){
    imageData.data[i] = buffer[i];
    imageData.data[i + 1] = buffer[i + 1];
    imageData.data[i + 2] = buffer[i + 2];
}

ctx.putImageData(imageData, 0, 0);

Wenn Sie mit Chrome ein Profil erstellen, wird es 44% langsamer ausgeführt als der folgende Code, in dem CanvasPixelArray nicht verwendet wird.

tempArray = new Array(500 * 500 * 4);
imageData = ctx.getImageData(0, 0, 500, 500);

for (var i = 0; i < imageData.length; i += 4){
    tempArray[i] = buffer[i];
    tempArray[i + 1] = buffer[i + 1];
    tempArray[i + 2] = buffer[i + 2];
}

ctx.putImageData(imageData, 0, 0);

Meine Vermutung ist, dass der Grund für diese Verlangsamung in der Konvertierung zwischen den Javascript-Doubles und den internen 8-Bit-Ganzzahlen ohne Vorzeichen liegt, die vom CanvasPixelArray verwendet werden.

Ist diese Vermutung richtig?Ist es trotzdem nötig, um den Zeitaufwand für das Festlegen von Werten im CanvasPixelArray zu verringern?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage