Workers ♥ ArrayBuffer

אריק בידלמן

החל מ-crbug.com/73313, תמיכה ב-Chrome 13 וב-FF5 לשליחת ArrayBuffer (או מערך מוקלד) אל Web Worker או ממנו. לדוגמה:

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 להקשר של העובד, ולהפך. כך טמון פוטנציאל אמיתי לעובדים שלא ראינו בעבר. כלומר היכולת להעביר בקלות נתונים בינאריים בין האפליקציה הראשית לבין ה-thread של ה-worker.

מערך קלט/פלט מוקלד הופך את מניפולציית התמונות, עיבוד הצלילים וחישובי WebGL כבדים לביצוע הרבה יותר אפשריים. לדוגמה, אפשר לקרוא קובץ בתור מאגר של מערך נתונים או לאחזר בוה (Blob) באמצעות XHR2 ולהעביר את התוצאה ישירות לעובד. אין יותר צורך בקידוד base64 לנתונים :)

לדעתי, זהו אחד מהתחומים הפרטים האלה שהעובדים צריכים לכלול כבר מההתחלה. זה פשוט הגיוני.