I have a Direct3D 9 application and I would like to monitor the memory usage. Is there a tool to know how much system and video memory is used by Direct3D? Ideally, it would also report how much is allocated for textures, vertex buffers, index buffers...
2 に答える
古い DirectDraw インターフェイスを使用して、合計および使用可能なメモリを照会できます。
ただし、その方法で得られる数値は信頼できません。
空きメモリはいつでも変更される可能性があり、使用可能なメモリには AGP メモリが考慮されることがよくあります (これは厳密にはビデオ メモリではありません)。数値を使用して、アプリケーション/ゲームのデフォルトのテクスチャ解像度と詳細レベルを推測できますが、それだけです。
リソースの使用状況を追跡するのはそれほど難しいことではないのに、なぜより良い数値を取得する方法がないのか疑問に思うかもしれません。
アプリケーションの観点からは、これは正しいことです。ビデオ メモリには、サーフェス、テクスチャ、インデックス バッファー、頂点バッファー、およびいくつかのシェーダー プログラムだけが含まれていると考えるかもしれませんが、低レベルの側ではそうではありません。
他にもたくさんのリソースがあります。これらはすべて Direct3D ドライバーによって作成および管理され、レンダリングを可能な限り高速にします。とりわけ、階層的な z バッファ アクセラレーション構造、事前にコンパイルされたコマンド リスト (たとえば、GPU が理解する形式で何かをレンダリングするために必要なデータ) があります。ドライバーは、フレームレートを均等にし、GPU と CPU 間の並列性を高めるために、事前に複数のフレームのレンダリング コマンドをキューに入れることもできます。
ドライバーは、ボンネットの下で多くの作業も行います。ヒューリスティックを使用して、静的なジオメトリと一定のレンダリング設定でドローコールを検出します。このような場合、ドライバーは、キャッシュの使用を改善するためにジオメトリを最適化することを決定できます。これはすべて、ドライバーの制御下で並行して行われます。これらすべてにはスペースも必要であるため、空きメモリはいつでも変更される可能性があります。
ただし、ドライバーはリソースのキャッシュも行うため、最初からリソースの使用状況を知る必要はありません。
利用可能なスペースよりも多くのスペースが必要な場合でも、問題ありません。ドライバーは、システム RAM、AGP メモリ、およびビデオ RAM の間でデータを移動します。実際には、ビデオ メモリが不足することを心配する必要はありません。確かに-利用可能なビデオメモリよりも多くのビデオメモリが必要になると、パフォーマンスが低下しますが、それが人生です:-)
2 つの提案:
さまざまな回数でGetAvailableTextureMemを呼び出して、全体的なメモリ使用量の進行の (大まかな) 見積もりを取得できます。
nVidia で開発すると仮定すると、PerfHUDには、消費された AGP/VID メモリ (分離) のグラフィック表示が含まれます。
おそらく、メモリ消費者(頂点バッファなど)とメモリ位置(AGP、VID、システム)のきれいなマトリックスを取得することはできません-
(1) ドライバは、メモリ タイプ間でリソースを自由に転送できます。
(2) メモリ コンシューマの実際の種類は、公開されている D3D インターフェイスよりもはるかに多い。