2

私は大学で科学的な目的で地図アプリケーションを開発しようとしています。そのため、私は多くのタイル(256x256)にアクセスできました。それらにアクセスして、別のQThreadのQImageに保存できます。私の問題は、QImageを別のQThread(GUIメインスレッドではない)内のテクスチャに実際にロードするにはどうすればよいですか?または、この問題に取り組む方法を教えてください。

マルチスレッドのOpenGLについては考えましたが、OpenGLの選択も必要であり、そのために役立つものは何もありませんでした。#

Linuxでコンパイルされるすべてのものに感謝します:)

注1:イベントベースのレンダリングを使用しているため、シーンが変更された場合にのみ再描画されます。注2:OSGはオプションではありません。その目的には非常に重いため、軽量のアプローチが必要です。注3:アプリケーションは完全にC++で記述されています

返信ありがとうございます。PSは辛抱強く、このトピックが示唆している(または示唆していない)ので、私はそれほど進んでいません。

4

2 に答える 2

2

OpenGL はスレッドセーフではありません。一度に 1 つのスレッドで使用できる GL コンテキストは 1 つだけです。OS によっては、別のスレッドで使用するために、あるスレッドでコンテキスト ハンドルを明示的に放棄する必要もあります。

ここでのボトルネックはグラフィックス カードへの帯域幅であるため、スレッド化によってテクスチャの読み込みを高速化することはできません。

タイルをロードする配信スレッドでリング バッファーがいっぱいになるようにします。GL スレッドはリング バッファーからフィードします。2 つのミューテックスを使用すると、リング バッファーを簡単に制御して、このスレッドセーフな操作を行うことができます。

それが私の提案です。

于 2010-01-21T22:18:11.543 に答える
1

高速化するために私が使用する 2 つのトリック:

  • ピクセル バッファ オブジェクト: ロード スレッドが直接 GPU に書き込めるように GPU メモリをマップします。
  • 同期オブジェクト: 同期オブジェクトを使用すると、テクスチャを実際に使用する準備ができていることがわかります (PBO を使用した glTexImage2D は非同期であるため、テクスチャをバインドする準備ができているという保証はありません。つまり、テクスチャをバインドするときに、DMA がブロックされた場合はブロックされます)。 t テクスチャ データの更新を終了します)
于 2011-05-16T18:04:44.693 に答える