自 crbug.com/73313 起,Chrome 13 和 FF5 支持向 Web Worker 发送 ArrayBuffer
(即类型化数组)或从中发送 ArrayBuffer
。例如:
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);
为什么这会令人兴奋?...二进制数据!
浏览器不会将 postMessage()
数据序列化为 JSON 对象,而是使用结构化克隆算法将 ArrayBuffer
复制到 worker 的上下文,反之亦然。这为工作器释放了前所未有的真实潜力。也就是说,能够在主应用和工作器线程之间轻松传递二进制数据。
类型化数组 I/O 大大提高了密集的图片处理、声音处理和密集的 WebGL 计算的可行性。例如,您可以以数组缓冲区的形式读取文件或使用 XHR2 提取 Blob,并将结果直接传递给 worker。不再需要对数据进行 base64 编码 :)
在我看来,这正是工作者从一开始就应该纳入的那些挑衅者之一。这很有道理。