Nœuds de calcul ♥ ArrayBuffer

Depuis crbug.com/73313, Chrome 13 et FF5 permettent d'envoyer un ArrayBuffer (ou tableau typé) à/depuis un Web Worker. Exemple :

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

Pourquoi est-ce intéressant ?...Les données binaires !

Au lieu de sérialiser vos données postMessage() dans un objet JSON, le navigateur utilise l'algorithme de clonage structuré pour copier le ArrayBuffer dans le contexte du worker, et inversement. Cela ouvre un potentiel réel pour les travailleurs, qui n'avait jamais été vu auparavant. Autrement dit, vous pouvez facilement transmettre des données binaires entre l'application principale et le thread de travail.

Les E/S de tableaux typés rendent la manipulation intense des images, le traitement du son et les calculs WebGL lourds beaucoup plus réalisables. Par exemple, vous pouvez lire un fichier en tant que tampon de tableau ou extraire un blob à l'aide de XHR2 et transmettre le résultat directement à un nœud de calcul. Plus besoin d'encoder les données en base64 :)

À mon avis, il s'agit de l'un de ces détails que les travailleurs auraient dû inclure dès le départ. C'est logique.