Arraybuffer ♥ worker

Eric Bidelman

A partire da crbug.com/73313, Chrome 13 e FF5 supportano l'invio di un ArrayBuffer (o array typed) a/da un web worker. Ad esempio:

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);

Perché è entusiasmante?...dati binari!

Anziché serializzare i dati postMessage() in un oggetto JSON, utilizza l'algoritmo di clone strutturato per copiare ArrayBuffer nel contesto del worker e viceversa. Questo crea un reale potenziale per i lavoratori che non abbiamo mai visto prima. Ciò significa che è possibile passare facilmente dati binari tra l'app principale e il thread di lavoro.

L'I/O degli array digitati rende molto più fattibili la manipolazione delle immagini, l'elaborazione del suono e pesanti calcoli WebGL. Ad esempio, potresti leggere un file come buffer di array o recuperare un BLOB utilizzando XHR2 e passare il risultato direttamente a un worker. Nessun'altra codifica Base64 per i dati :)

A mio parere, questa è una di quelle trucchetti che i lavoratori avrebbero dovuto includere sin dall'inizio. Ha senso.