1

Chrome では 100、FireFox では 0 を示すfiddleがあります。どちらも最新の安定版リリースでテスト済みです。

WebWorker コード:

self.onmessage = function(event) {
    postMessage({len: event.data.arr.length});
};

そしてメインコード:

var worker = new Worker("worker.js");

worker.onmessage = function(event) {
    console.log(event.data);
};

var arr = new Uint8Array(100);

worker.postMessage({
    arr: arr
}, [arr.buffer]);

どちらも転送可能な配列をサポートしています。引数を削除すると、[arr.buffer]問題なく送信されますが、パフォーマンスの向上が失われ、構造化されたクローンに戻ります。

転送可能な動作を維持しながら、これを両方のブラウザで機能させるにはどうすればよいですか?

(ちなみに、私は実際に複数のアレイを使用しており、それらの合計は約 10MB です)。

4

1 に答える 1

1

私はこれを経験したばかりで、これがバグなのか仕様によるものなのかを質問しました。

これに対する回避策を思いつきました: 配列の長さがゼロで明らかに空であっても、そのバッファーはまだそこにあり、そのバッファーで配列を再インスタンス化すると、データにアクセスできます。

// page:
worker.postMessage({
  arr: arr
}, [arr.buffer]);

// worker:
self.onmessage = function(event) {
  var arr = new Uint8Array(event.data.arr.buffer);
  postMessage({len: event.data.arr.length, arrLen: arr.length});
};

ここに実用的なフィドルがあります:http://jsfiddle.net/HLpwV/3/

于 2013-12-21T05:00:21.397 に答える