2017-12-26 22 views
1

私は2つのOpenGLレンダリングスレッドを持っていて、それぞれにコンテキストを設定するパターンがあり、固定フレームレートで描画しています。レースはありますか?wglMakeCurrent、Drawing、およびMultithreadingはレースを引き起こしますか?

私は次のことが起こるだろうことを心配しています:1つの呼び出しが

  • スレッド2回の通話が
  • スレッド2が
  • スレッド1がターンで
  • を描く描くwglMakeCurrent wglMakeCurrent

    1. スレッド両方のスレッドが第2のスレッドのコンテキスト上に描画されます。

      レンダリングコンテキストを設定するたびにロックを使用して、操作が他のレンダリングスレッドに干渉しないようにする必要がありますか?

    +0

    はよりdetails.httpsのための私の答えを参照してください://stackoverflow.com/questions/47918078/creating-opengl-structures-in-a-multithreaded-program/47921647#47921647スレッドが暗黙のうちに復元/保存 –

    答えて

    0

    各スレッドが独自のコンテキストを持つ限り、両方のスレッドを安全に描画できます。

    スレッド間で単一のコンテキストを共有する場合のみ、コンテキストが一度に1つのスレッド内でのみ最新であることを確認する必要があります。アップ

    documentationwglMakeCurrent()のセットのルール:

    スレッドが1つの、現在のレンダリングコンテキストを持つことができます。プロセスは、マルチスレッド化によって複数のレンダリングコンテキストを持つことができます。

    スレッドは、OpenGL関数を呼び出す前に、現在の描画コンテキストを設定する必要があります。それ以外の場合、すべてのOpenGL呼び出しは無視されます。

    レンダリングコンテキストは、一度に1つのスレッドに対してのみ有効です。レンダリングコンテキストを複数のスレッドに対してカレントにすることはできません。

    アプリケーションは、さまざまなレンダリングコンテキストを異なるスレッドにカレントにし、各スレッドに独自のレンダリングコンテキストとデバイスコンテキストを提供することで、マルチスレッド描画を実行できます。

    +0

    を切り替えませんスレッドのコンテキストをレンダリングしますか? – Dmitry

    +0

    ああそうです。 [wglMakeCurrent関数は、指定されたOpenGLレンダリングコンテキストを呼び出しスレッドの現在のレンダリングコンテキストにします。 "](https://msdn.microsoft.com/en-us/library/windows/desktop/dd374387(v = vs.85).aspx ) – Dmitry

    +0

    https://msdn.microsoft.com/en-us/library/windows/desktop/dd374387(v=vs.85).aspxの 'wglMakeCurrent()'のドキュメントを見てください。 備考欄 – sterin

    関連する問題