Nœuds de calcul ♥ ArrayBuffer

Eric Bidelman

Depuis crbug.com/73313, Chrome 13 et FF5 permettent l'envoi d'un ArrayBuffer (tableau typé) vers/depuis un worker Web. 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 passionnant ?...les données binaires !

Au lieu de sérialiser vos données postMessage() dans un objet JSON, le navigateur utilise l'algorithme de clone structuré pour copier le ArrayBuffer dans le contexte du worker, et inversement. Pour les travailleurs, cela offre un réel potentiel que nous n'avons jamais vu auparavant. Autrement dit, il est possible de transmettre facilement des données binaires entre l'application principale et le thread de travail.

Les E/S de tableau typé rendent la manipulation d'image intense, le traitement du son et les calculs WebGL beaucoup plus réalisables. Par exemple, vous pouvez lire un fichier sous forme de tampon de tableau ou extraire un objet Blob à l'aide de XHR2, puis transmettre le résultat directement à un nœud de calcul. Vous n'avez plus besoin d'encoder les données en base64.

À mon avis, c'est l'une de ces petites attentions que les employés auraient dû inclure dès le début. C’est tout simplement logique.