Arbeiter ♥ ArrayBuffer

Seit crbug.com/73313 unterstützen Chrome 13 und FF5 das Senden eines ArrayBuffer (oder Typed Array) an/von einem Webworker. Beispiel:

worker.js

self.onmessage = function(e) {
    var uInt8Array = e.data;
    postMessage("Inside worker.js: uInt8Array.toString() = " + uInt8Array.toString());
    postMessage("Inside worker.js: uInt8Array.byteLength = " + uInt8Array.byteLength);
};

main.html

var uInt8Array = new Uint8Array(new ArrayBuffer(10));
for (var i = 0; i < uInt8Array.length; ++i) {
    uInt8Array[i] = i * 2; // [0, 2, 4, 6, 8,...]
}

console.log('uInt8Array.toString() = ' + uInt8Array.toString());
console.log('uInt8Array.byteLength = ' + uInt8Array.byteLength);

worker.postMessage(uInt8Array);

Warum ist das spannend? Weil es sich um Binärdaten handelt.

Anstatt die postMessage()-Daten in ein JSON-Objekt zu serialisieren, verwendet der Browser den strukturierten Klonalgorithmus, um die ArrayBuffer in den Kontext des Workers zu kopieren und umgekehrt. Das eröffnet Arbeitnehmern ein bisher nicht dagewesenes Potenzial. Das bedeutet, dass binäre Daten einfach zwischen der Haupt-App und dem Worker-Thread übergeben werden können.

Durch die typisierte Array-E/A sind intensive Bildmanipulation, Tonverarbeitung und umfangreiche WebGL-Berechnungen viel einfacher möglich. So können Sie beispielsweise eine Datei als Array-Buffer lesen oder einen Blob mit XHR2 abrufen und das Ergebnis direkt an einen Worker übergeben. Die Daten müssen nicht mehr base64-codiert werden.

Meiner Meinung nach ist dies eine dieser Kleinigkeiten, die die Mitarbeiter von Anfang an hätten berücksichtigen sollen. Das ergibt einfach Sinn.