4

キャンバスからの画像データに対してwebworkerで処理を実行しようとしています。私が正しく知っている解決策は、かなりうまく機能しますが、処理を行うときにまだいくつかの目に見える遅れがあります(処理以外に、Webカメラからキャンバスにビデオを描画する必要があり、遅れ始めます)。

だから私はwebworkerを使おうとしましたが、すべてを非同期で行いました。唯一の問題は、JSON.stringifyを使用すると、実際の処理よりも時間がかかることです。

私の質問:worker.postMessageを介して大量のデータをすばやく渡す方法は他にありますか?私が知らないある種の回避策はありますか?

小さなサブ質問:Webworkerは何のためにあるのですか?私は労働者が本当に役に立たず、文字列だけを渡すことに気づきました。

編集:

重複の可能性:Webワーカーとメインスレッド間で大量のデータを渡す

4

1 に答える 1

3

すべてがWebWorkerにコピーされるので、計算が非常に集中的でない限り、そこで多くの利益が得られるとは思えません。

WebWorkersは、実行時間の長い、計算量の多いアルゴリズムを対象としています。明らかなユースケースは次のとおりです。

  • WebゲームのAI
  • レイトレーサー
  • 大規模なデータセットでの圧縮/解凍
  • 表示される前に多くの処理を必要とするAJAXリクエスト
  • その他の複雑なアルゴリズム

データは双方向にコピーされるため、何をしているかに注意する必要があります。WebWorkersはDOMにアクセスできないため、あなたがやろうとしていることに役に立たない可能性があります。あなたのアプリが何をするのかわかりませんが、それほど激しくないようです。

複数のタブ/ウィンドウで共有できるSharedworkersもあります。これは、タブ間でデータを渡すための非常に優れた方法です。

編集:

構造化クローンアルゴリズムも調べてください。多くの点でJSONよりも効率的であり、ImageDataを複製することもできます(したがって、文字列をサポートするだけではなくなりました)。

クローンアルゴリズムをサポートしていないブラウザの場合は、base64を検討することをお勧めします。バイナリデータを保存するのはまともで、JSON.stringifyよりも高速だと思います。ただし、それを処理するためにいくつかのコードを作成する必要があるかもしれません。

于 2012-12-05T22:14:35.023 に答える