Arbeiter ♥ ArrayBuffer

Eric Bidelman

Ab crbug.com/73313 unterstützen Chrome 13 und FF5 das Senden von ArrayBuffer (oder Typed Arrays) an/von einem Web Worker. 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 sind das aufregend?...Binärdaten!

Anstatt Ihre postMessage()-Daten vom Browser in ein JSON-Objekt zu serialisieren, verwendet der Browser den Algorithmus zum strukturierten Klonen, um die ArrayBuffer in den Worker-Kontext zu kopieren und umgekehrt. Dies eröffnet Arbeitskräften ein bisher völlig neues Potenzial. Das heißt, die Möglichkeit, Binärdaten einfach zwischen Haupt-App und Worker-Thread zu übertragen.

Typiertes Array-E/A macht intensive Bildbearbeitung, Tonverarbeitung und umfangreiche WebGL-Berechnungen wesentlich einfacher. Sie können beispielsweise eine Datei als Array-Zwischenspeicher lesen oder einen Blob mit XHR2 abrufen und das Ergebnis direkt an einen Worker übergeben. Keine base64-Codierung der Daten mehr :)

Meiner Meinung nach ist dies einer dieser Kleinigkeiten, die Worker von Anfang an hätten verwenden sollen. Es macht einfach Sinn.