私は、レンダリングデータの1つのブロックであることを意味する、minecraftのようなチャンクシステムを持っています。プレイヤーが移動して別のチャンクに入ると、新しいものがロードされている間に範囲外のチャンクがアンロードされているので、レンダリングデータを表示する前に別のスレッドでレンダリングデータを計算する必要があります。データはすでにそれがこのVBOをスレッド間で同期させるための最良の方法
メイン/スレッドがデータ生成スレッド
| Request Chunk |
| -------------------------------> |
| |
| | Generating render data (FloatBuffer)
| |
| .
| .
| .
| Get Ready Chunks |
| <------------------------------- |
| |
| Upload Data |
| |
| Render |
| |
「要求チャンク」とは、「レディチャンクを取得します」そう同期されていないレンダーのように見えるディスクからロードされると仮定すると、
レンダリングスレッドは実際には独立して動作します。
この問題は、一度にたくさんのチャンクをアップロードすると、フレームドロップが発生しますが、アップロードするまでにどれくらい時間がかかるかを計算することは確実にできません。フレームごとに1つだけ増やしても、スピードをあげることはできませんが、それはうまくいきます(現時点では実装されています)。
私は1つのGLコンテキストしか使用していないので、今はメインスレッドでのみVBOを作成できます。
他のスレッドでVBOを作成してメインスレッドに渡すなど、これを解決する方法はありますか?
実際には、[here](http://stackoverflow.com/questions/8912986/opengl-vbo-within-multiple-threads)などの共有コンテキストを使用して、スレッド間でバッファを作成/共有することができます。ここに](http://stackoverflow.com/questions/7495109/multiple-context-with-different-version)と[ここ](http://stackoverflow.com/questions/8116305/opengl-secondary-thread-for-ロードリソース/ 8126219#8126219)。 – BDL
まあ、私が知らなかったことがあります。私はこれを調べます。 – Bartvbl
@BDL:私が読んでいるもの(あなたがリンクしたページ以外のページでも)から、複数のコンテキストは、ほとんどのドライバによってシリアルOpenGLコールに変換されます。したがって、OpenGLコンテキストスイッチのパフォーマンスペナルティを犠牲にして、OpenGLにリソースを自由にアップロードできることを除けば、複数のコンテキストを使用するもう1つの理由はありますか?私には、複数フレームにわたるリソースローディングのストリーミングとスミアリングが優れているようです。 – Bartvbl