5

OpenGL ドライバーの機能を複製するコードを書くのに時間を費やしたくないので、この質問をしています。

OpenGL ドライバー/サーバーは、ビデオ カードよりも多くのデータを保持できますか? たとえば、10 個のテクスチャを保持するのに十分なビデオ RAM があるとします。GL_OUT_OF_MEMORY エラーを発生させずに、OpenGL に 15 個のテクスチャを割り当てるように依頼できますか?

必要に応じて「通常の」RAM からビデオ RAM にテクスチャ/バッファ/オブジェクトを巧みに送信するドライバーに依存できる場合、これらのオブジェクトを自分で生成/削除する必要はありません。ビデオ RAM と比較すると、多くの場合、「通常の」RAM によって制限されます。

4

3 に答える 3

7

「メモリが豊富だから削除しなくていい」というアプローチはまずいし、「メモリが豊富だから絶対にメモリエラーが出ない」というアプローチには欠陥があります。

OpenGL のメモリ管理は、技術的な理由 (上記の t.niese のコメントを参照) とイデオロギー上の理由 (「知る必要はない、知りたくない」) の両方から、あいまいです。ベンダー拡張 (ATI_meminfo など) は存在しますが、いくつかの正式な番号 (次のミリ秒を変更できる限り非正式であり、フラグメンテーションなどの影響を考慮していません) をクエリできます。

一般に、ほとんどの場合、GPU メモリよりも多くのメモリを使用できるという想定は正しいです。

ただし、通常、使用可能なメモリをすべて使用できるわけではありません。多くの場合、ドライバーが割り当て、ロック、および DMA との間で割り当て、ロック、および DMA を行うことができるメモリ領域 (および領域の大きさ) の制約により、「利用可能なすべての RAM」をはるかに下回る制限があります。また、通常は GPU に収まるよりも多くのメモリを使用できますが (排他的に使用した場合でも)、これは、不注意な割り当てが失敗する可能性があり、最終的に失敗しないという意味ではありません。

必ずというわけではありませんが、通常は、GPU メモリと同じくらい多くのシステム メモリも消費します (知らないうちに、ドライバーは密かにそれを行っています)。ドライバーは必要に応じてリソースをスワップインおよびスワップアウトするため、コピーを維持する必要があります。場合によっては、2 つまたは 3 つのコピーを保持する必要があります (ストリーミング時や ARB_copy_buffer 操作など)。バッファ オブジェクトのマッピングが、特別に割り当てられたブロック内の別のコピーである場合もあれば、ドライバのメモリに直接書き込むことが許可されている場合もあります。一方、PCIe 2.0 (および PCIe 3.0 はさらに高速) は、メイン メモリから頂点をストリーミングするのに十分な速さであるため、厳密には GPU メモリは必要ありません (小さなバッファーを除いて)。一部のドライバーは、動的ジオメトリをシステム メモリからすぐにストリーミングします。

一部の GPU には、別個のシステムと GPU メモリさえありません (Intel Sandy Bridge または AMD Fusion)。

また、オブジェクトを削除しても、必ずしもそれらが削除されるとは限らないことに注意してください (少なくともすぐには削除されません)。通常、ごくわずかな例外を除いて、OpenGL オブジェクトの削除は一時的な削除に過ぎず、それ以上オブジェクトを参照することはできません。ドライバは、必要な限りオブジェクトを有効に保ちます。

一方で、不要になったものは本当に削除するべきであり、早期に削除する必要があります。たとえば、シェーダーをプログラム オブジェクトにアタッチした直後にシェーダーを削除する必要があります。これにより、リソースがリークしないことが保証され、動作が保証されます。ストリーミング時に使用中の頂点またはピクセル バッファーを削除して再指定する (呼び出しによることglBufferData(... NULL);はよく知られている慣用句です。これはオブジェクトのビューにのみ影響し、ドライバーは古いオブジェクトを並行して使用し続けることができます。必要に応じて。

于 2013-05-31T11:41:11.647 に答える
3

ここに私の TL;DR の回答があります。Daemon と t.niese の回答も読むことをお勧めします。

OpenGL ドライバー/サーバーは、ビデオ カードよりも多くのデータを保持できますか?

はい

たとえば、10 個のテクスチャを保持するのに十分なビデオ RAM があるとします。GL_OUT_OF_MEMORY エラーを発生させずに、OpenGL に 15 個のテクスチャを割り当てるように依頼できますか?

はい。ドライバーと GPU の組み合わせによっては、GPU のメモリを超える単一のテクスチャを割り当てて、実際にレンダリングに使用することさえ可能になる場合があります。私の現在の職業では、その事実を利用して、大規模なボリューム データセットから任意の方向とジオメトリのスライスを抽出し、シェーダーを使用してその場でボクセル データにフィルターを適用しています。うまく機能しますが、インタラクティブなフレーム レートでは機能しません。

于 2013-05-31T12:59:52.990 に答える