GL_STATIC_DRAW対GL_DYNAMIC_DRAW対GL_STREAM_DRAW:それは重要ですか?


11

OpenGLでバッファオブジェクト関数(glBufferDataglBufferSubData、そしておそらくいくつかの他)は、パラメータ持つusage可能性の高い実装歩留まりより良いパフォーマンスを助けるためのもの使用目的、のヒントとして文書による説明を。

使用法

データストアの予想される使用パターンを指定します。シンボル定数でなければなりませんGL_STREAM_DRAWGL_STREAM_READGL_STREAM_COPYGL_STATIC_DRAWGL_STATIC_READGL_STATIC_COPYGL_DYNAMIC_DRAWGL_DYNAMIC_READ、またはGL_DYNAMIC_COPY
[...]
使用法は、バッファオブジェクトのデータストアへのアクセス方法に関するGL実装へのヒントです。これにより、GL実装は、バッファーオブジェクトのパフォーマンスに大きな影響を与える可能性のあるよりインテリジェントな決定を行うことができます。ただし、データストアの実際の使用は制限されません。

wikiも同様にあいまいです。

結局のところ、これらはヒントにすぎません。作成後にSTATICバッファーを変更すること、またはSTREAMバッファーを変更しないことは、完全に正当なOpenGLコードです。
[...]
これらは、慎重なプロファイリングでのみ回答できる質問です。そして、それでも、答えはその特定のハードウェアベンダーからの特定のドライバーバージョンに対してのみ正確になります。

結局のところ、このパラメーターはどの程度関連性がありますか?ドライバーは実際にそれを考慮に入れていますか?それを考慮に入れている場合、実際のパフォーマンスにどの程度影響を与えますか?共有するデータはありますか?

私は既存のAPIのいずれかとして実装されることを意図した薄いグラフィックAPI抽象化レイヤーを作成しました。このパラメーターを完全に無視して、公開された抽象化からそれを非表示にしたくなります。

回答:


7

これは実装によって異なりますが、私が作業したドライバーは、主にメモリレイアウトを決定するためにこれらを使用しました。これらのヒントによって有効化される最適化は、主にどのようなヒントを使用しても実行できるという制限があるため、希望よりもはるかに小さくなります。たとえば、読み取りアクセスのみを示唆するバッファをまったく書き込むことができなかった場合、キャッシュの無効化が大幅に安価になりますが、この最適化は不可能です。

GPU間のベンチマーク比較に広く使用されているいくつかの注目のゲームは、これらのヒントを正しく使用しないため、GPUベンダーは、ヒントと一致しなくてもすべての使用を高速化するインセンティブを持っています。


4

機能的には同じです。

ドライバーはそれらを使用して、舞台裏でバッファーを処理する方法を区別できます。たとえば、static_drawはできるだけ早くvramにコピーされてそこに残されますが、stream_readは常にRAMにコピーする日付を操作する必要があります。

この曖昧さが、glBufferStorageが物になった理由です。こうすることで、バッファで実行できるようにしたいことを指定します(BufferSubDataを介してバッファを更新するかどうか、マップを介して読み取るか書き込むか、マッピングの一貫性、マッピングが用途を超えて持続できるかどうか)これらの境界の外に出るとエラーになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.