WebGLはレンダリングコマンドの完了を待たずに長いリストを送信することができます。ただし、何らかの理由でレンダリングが完了するまで待つ必要がある場合は、gl.finish()
と同時に行う必要があります。確かに、gl.finish
がコールバックを受け入れ、直ちに返されると良いでしょうか?WebGLでは、gl.finish()への非同期呼び出しをエミュレートすることが可能です。
質問:これを確実にエミュレートする方法はありますか?
使用ケース:私は大オフスクリーンキャンバスに頂点の数が多いをレンダリングし、ページ上の小さなキャンバスに、この大きなキャンバスのセクションをコピーするdrawImage
を使用しています。私は実際にgl.finish()
を使用していませんが、drawImage()
と同じ効果があるようです。私のアプリケーションでは、再レンダリングは、ユーザが(例えばボタンをクリックするなどして)アクションを実行したときにのみトリガされ、数百ミリ秒かかります。レンダリング中にブラウザが応答してスクロールなどができるようなら、私はChromeソリューションを探していますが、FirefoxやSafariでも動作するものは良いでしょう。
可能な(悪い)答え:あなたがしようとするとレンダリングが連れて行くと、その後gl.finish()
への呼び出しで始まるタイムアウトを設定されているどのくらい見積もることができます。しかし、すべてのサイズの頂点バッファとすべてのユーザに対してこの見積もりを確実に行うことは、非常に難しく、不正確になるでしょう。
可能な(不)回答:私は探しているものをしていますが、それはしませんか?
非同期バージョンがないので、 'async' gl.finish()を使用して同じページからレンダリングする方法はありません。オフスクリーンイメージが「重い」と考えられる場合は、Web Workerを使用してイメージを生成し、そのイメージをpostMessageに戻してキャンバスに描画することができます。それはパフォーマンスをわずかに節約しますが、まだ描画を同期させる必要があります。 キャンバスの解像度を下げるとスピードアップする可能性があります。 – moka
@MaksimsMihejevs - Webワーカーからのイメージのレンダリングは非同期ですが、GPUではなくCPUを使用するため、処理速度が大幅に遅くなります。 (WebWorkersからWebGLにアクセスすることはできません。) –
'drawImage'を言及したように、私はキャンバスの2dコンテキストについて詳しく説明しました。 – moka