4

私はコア OpenGL 機能を Delphi VCL カスタム コントロール内にラップしてきました。TTimer現在、このコントロール内で作成されたを使用してループを実行しています。描画が重複して遅延する可能性があるため、タイマーの使用は完全に間違っていると強く感じています。代わりに、この描画ループをスレッド内に配置したいと思います。ちらつきのいくつかの問題がある私の元の質問を参照してください-TTimer私が使用しているに責任を負わせています。

質問

OpenGL はスレッド内で安全に使用できますか? 何を知っておくべきですか?このスレッドの内側と外側の両方から OpenGL API 呼び出しを行う予定です。これは基本的に連続ループであり、描画が終了するとすぐに再び描画を開始します。現在、タイマーを使用して、タイマーの間隔に達するのを待つことに依存しています。たとえば、タイマーの間隔が 100 ミリ秒に設定されていて、描画に 20 ミリ秒しかかからない場合、再度描画するまで 80 ミリ秒待機します。スレッドを使用すると、この遅延が解消されます。このスレッド内からそのような呼び出しを行うにはどうすればよいですか?

バックグラウンド

すべての API 呼び出しの元となった元のサンプル プロジェクトは、アプリケーションのメイン スレッドを使用しており、実際には VCL をまったく使用していませんでした。画像を表示する Window は純粋な Windows API 呼び出しを使用して動的に作成され、描画はアプリケーションのメイン スレッドの連続ループ内から繰り返されました。これが、スレッドを使用すると多くの問題、特にちらつきが解決されると信じている理由です。

4

1 に答える 1

5

1 つの OpenGL コンテキストは、特定の 1 つのスレッドでのみ現在 (アクティブ) にすることができます。したがって、スレッドで現在のコンテキストを正しくアンバインド/再バインドするか、データを共有する 2 つのコンテキストを使用する必要があります。OpenGL 呼び出しを行う単一のスレッドのみを使用するように設計を再構築することを強くお勧めします。背景の詳細​​については、http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.htmlを参照してください。

于 2012-05-25T06:47:53.690 に答える