Начиная с crbug.com/73313 , Chrome 13 и FF5 поддерживают отправку ArrayBuffer
(или типизированного массива) в/из веб-работника. Например:
рабочий.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
в контекст работника и наоборот. Это открывает реальный потенциал для работников, которого мы раньше не видели. То есть возможность легко передавать двоичные данные между основным приложением и рабочим потоком.
Ввод-вывод с использованием типизированных массивов делает интенсивные манипуляции с изображениями, обработку звука и тяжелые вычисления WebGL гораздо более осуществимыми. Например, можно прочитать файл как буфер массива или получить большой двоичный объект с помощью XHR2 и передать результат непосредственно работнику. Больше нет кодирования данных в base64 :)
По моему мнению, это одна из тех придирок, которые работникам следовало бы учесть с самого начала. Это просто имеет смысл.