Рабочие ♥ ArrayBuffer

Начиная с 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 :)

По моему мнению, это одна из тех придирок, которые работникам следовало бы учесть с самого начала. Это просто имеет смысл.