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.