2013-06-11 5 views
11

WebGLはレンダリングコマンドの完了を待たずに長いリストを送信することができます。ただし、何らかの理由でレンダリングが完了するまで待つ必要がある場合は、gl.finish()と同時に行う必要があります。確かに、gl.finishがコールバックを受け入れ、直ちに返されると良いでしょうか?WebGLでは、gl.finish()への非同期呼び出しをエミュレートすることが可能です。

質問:これを確実にエミュレートする方法はありますか?

使用ケース:私は大オフスクリーンキャンバスに頂点の数が多いをレンダリングし、ページ上の小さなキャンバスに、この大きなキャンバスのセクションをコピーするdrawImageを使用しています。私は実際にgl.finish()を使用していませんが、drawImage()と同じ効果があるようです。私のアプリケーションでは、再レンダリングは、ユーザが(例えばボタンをクリックするなどして)アクションを実行したときにのみトリガされ、数百ミリ秒かかります。レンダリング中にブラウザが応答してスクロールなどができるようなら、私はChromeソリューションを探していますが、FirefoxやSafariでも動作するものは良いでしょう。

可能な(悪い)答え:あなたがしようとするとレンダリングが連れて行くと、その後gl.finish()への呼び出しで始まるタイムアウトを設定されているどのくらい見積もることができます。しかし、すべてのサイズの頂点バッファとすべてのユーザに対してこの見積もりを確実に行うことは、非常に難しく、不正確になるでしょう。

可能な(不)回答:​​私は探しているものをしていますが、それはしませんか?

+0

非同期バージョンがないので、 'async' gl.finish()を使用して同じページからレンダリングする方法はありません。オフスクリーンイメージが「重い」と考えられる場合は、Web Workerを使用してイメージを生成し、そのイメージをpostMessageに戻してキャンバスに描画することができます。それはパフォーマンスをわずかに節約しますが、まだ描画を同期させる必要があります。 キャンバスの解像度を下げるとスピードアップする可能性があります。 – moka

+0

@MaksimsMihejevs - Webワーカーからのイメージのレンダリングは非同期ですが、GPUではなくCPUを使用するため、処理速度が大幅に遅くなります。 (WebWorkersからWebGLにアクセスすることはできません。) –

+0

'drawImage'を言及したように、私はキャンバスの2dコンテキストについて詳しく説明しました。 – moka

答えて

4

あなたは既に答えを部分的に打ちました:drawImage()は、画像データを読み返す前にすべての未解決の描画コマンドを強制的に終了させるという仕上がりのような振る舞いをしています。問題は、gl.finish()でレンダリングが完了するのを待っていても、今までと同じように動作します。メインスレッドは、レンダリングが終了している間にブロックされ、ユーザーのページとやりとりする機能が中断されます。

このシナリオでは、drawコマンドのセットが実際にブロックするのを待たずに完了したことを示す何らかのコールバックが理想的です。残念ながら、このようなコールバックは存在しません(ブラウザの内部機能の仕組みを考えれば、驚くほどのものを提供するのは驚くほど難しいでしょう)。

イメージを感じるときには、準備ができているかもしれません。たとえば、drawImageに電話する前に、ドローコールを3または4の​​に振り分けた後に、あなたが一貫してそれを(10フレーム?)長く取ることを観察する場合は、長い時間スピンしてください。これにより、ユーザーはページを通常どおり継続して使用することができ、レンダリングの途中で同期ステップを実行するため、コンテンツのレンダリングが完了したり、遅延が大幅に減ったりするため、あなたのサイトの意図された用途に応じて、非リアルタイムレンダリングはおそらく、プレゼンテーションの前に1秒間スピンすることさえあるかもしれません。

これは確かに完璧な解決策ではありません。私はあなたのためにより良い答えを得たいと思っています。おそらくWebGLはあなたのような場合には貴重なので、このタイプのステータスを将来照会する能力を得るでしょうが、これはおそらくあなたができる最高のものです。

+0

私はあなたの[webgl 2.0投稿](http://blog.tojicode.com/2013/09/whats-coming-in-webgl-20.html)を読んだところです。同期オブジェクトが問題をここで解決できると思うのは間違いないでしょうか? –

関連する問題