Ich versuche einige dynamische visuelle Effekte mit der Pixelmanipulation von HTML5 Canvas zu machen, aber ich stoße auf ein Problem, bei dem das Setzen von Pixeln im CanvasPixelArray lächerlich langsam ist.Warum werden die CanvasPixelArray-Werte von HTML5 lächerlich langsam und wie kann ich es schneller machen?
Zum Beispiel, wenn ich Code 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);
Profil mit Chrome zeigt, läuft es 44% langsamer 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 der Umwandlung zwischen den Javascript verdoppelt und der internen unsigned 8-Bit-Integer, verwendet von der CanvasPixelArray zurückzuführen ist.
- Ist diese Annahme richtig?
- Gibt es trotzdem eine Reduzierung der Zeitaufwand für das Festlegen von Werten im CanvasPixelArray?
Alte Frage und wahrscheinlich veraltet, in deinem zweiten Beispiel scheinst du nichts zu tun mit 'imageData' (z. B.Sie setzen die Werte nicht von 'tempArray' auf' imageData')? – ZachB
@ZachB Das Beispiel ist korrekt. Es verwendet nicht das CanvasPixelArray, das zu der Zeit der Flaschenhals zu sein schien. Unten finden Sie einige großartige Antworten, die das Problem gelöst haben. – Nixuz
Hah, ich habe deine Frage falsch gelesen. :) – ZachB