11

この行列乗算ベンチマークを開くと、ベンチマークが終了するまでブラウザー (Firefox 7.0.1) がフリーズしました (古い Asus EeePC 1000H でページを開きました)。

Web ワーカーは、処理と Web ページの表示を分離するために発明されたと聞きました。Web Workers API を利用して、WebGL が Web ブラウザ全体を停止させないようにすることは可能ですか?

4

3 に答える 3

28

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

(おもしろい事実-ベンチマークが構築されたとき、Web WorkersはTypedArraysをサポートしていませんでした。ほとんどのマトリックスライブラリは、当時、Workerで実行するのは非現実的でした。これは修正されました。)

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

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

もちろん、リアルタイムゲームをコーディングしている場合、それはあなたの時間の多くを浪費することになるものではありません。アニメーション、物理学、AI、衝突検出、パスファインディングなどがあります。グラフィック以外のタスクが多数含まれているため、CPUを有効にするとCPUが消費されます。場合によっては(アニメーション)、リンクしたベンチマークと同じように、通常は行列数学のゴブとゴブです。ただし、幸いなことに、このタイプの処理はワーカーで実行でき、メインスレッドに通信するために必要なのは、シーンのレンダリングに必要なデータだけです。

はい、これは同期とデータ転送の点でいくつかの課題をもたらしますが、全体として、500個のボックスの衝突をシミュレートする間、ブラウザをロックするよりも非常に望ましいでしょう。

于 2011-10-21T15:27:39.007 に答える
3

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

メインスレッドにコマンドを透過的にプロキシすることにより、Web Worker で WebGL を実行できるライブラリであるWebGLWorkerを確認できます。これがどのように機能するかを説明する素晴らしいブログ投稿です。

于 2015-09-24T13:21:04.987 に答える