2011-10-21 3 views
8

私はこのmatrix multiplication benchmarksを開き、ベンチマークが終了するまで私のブラウザ(Firefox 7.0.1)はフリーズしました(私は古いAsus EeePC 1000Hでページを開いた)。Webワーカー内部からWebGLを使用することは可能ですか?どうやって?

私は、WebワーカーがWebページの表示から処理を分離するために発明されたと聞きました。 Web Workers APIを使用してWebGL全体をWebブラウザにストールさせることはできますか?

+0

ベンチマークが古い(さまざまな行列ライブラリの古いバージョンを使用しています)、間違っていて無効です(実際に呼び出された関数が同じものを計算していたかどうかを確認するのは面倒ではありませんでした)。ここでは壊れていないものがありますhttp://stepheneb.github.com/webgl-matrix-benchmarks/matrix_benchmark.html – gman

+1

まだありません。しかし、WebWorkerでWebGLを検索すれば、それが動作していることがわかります。 – abergmeier

答えて

22

わかりやすくするために、リンク先のベンチマークではWebGLをまったく使用していません。 (私は知っているべきです、私はそれを書きました)。そして、その特定のベンチマークの場合、あなたは今、Webワーカーでそれを絶対に実行することができ、それは完全にうまくいくでしょう。

(面白いことに、Webワーカーはベンチマークが作成されたときにTypedArraysをサポートしていなかったし、ほとんどのマトリックスライブラリはその時点でワーカーで実行するのは実用的ではなかったからだ。 )

とにかく、元の質問に答える:いいえ、WebGLはワーカーで実行できません。 WebGLコンテキストを取得するには、キャンバス要素のgetContextを呼び出す必要があります。 Webワーカーは明示的にDOMアクセスを禁止しています(これは良いことですが、BTW!)ので、ワーカーからWebGLにアクセスすることはできません。

しかし、それはあなたが考えるほど悪くはありません。いずれにしても、ほとんどすべての3Dレンダリングが実際には別のスレッドで起こっていると考えてください。具体的には、あなたのGPU上で実行されているスレッドの束。ブラウザが持つ唯一の部分は、グラフィックスドライバに "ちょっと、このデータを使って三角形のレンダリングを開始してください!"と伝えることです。三角形が実際にレンダリングされるのを待たずに移動します。そのため、描画コマンドはメインプロセスから実行する必要がありますが、そのプロセスをブロックするのに費やす時間は(通常は)ごくわずかです。

もちろん、リアルタイムゲームをコーディングする場合は、時間の束を食べることはありません。あなたはアニメーション、物理、AI、衝突検知、経路探索を持っています...あなたがそれらを放つとあなたのCPUを生きて食べる多くの非グラフィカルなタスクがあります。いくつかのケース(アニメーション)では、リンクされたベンチマークのように、通常は行列の数学とゴブだけです!しかし、私たちのために幸いなことに、そのタイプの処理はワーカーで実行でき、メインスレッドに戻って通信する必要があるのはシーンをレンダリングするために必要なデータだけです。

はい、これは同期とデータ転送の面でいくつかの課題をもたらしますが、全体として、500個のボックスの衝突を試しながら試している間はブラウザをロックするほうがはるかに好ましいでしょう。

+0

ああ..これらのスクリプトはglMatrixとCanvasMatrixと呼ばれているので、WebGLを利用して行列を乗算すると仮定しました... –

2

Tojiが説明しているように、WebワーカーではデフォルトでWebGLを使用することはできません。

WebGLWorkerは、WebワーカーでWebGLの処理を可能にするライブラリで、コマンドを透過的にメインスレッドにプロキシすることができます。 これはどのように動作するのかを説明する素敵なblog postです。

関連する問題