2

.net/DirectX ベースのレンダリング ライブラリがあります。プログラムの開始時に、物理ビデオ RAM の量を調べようとします。物理ビデオ メモリの量を検出することは、テクスチャに使用できる量を知るために重要です (本格的な directX を行ったことがある場合は、おそらく既にわかっているでしょう)。

ビデオ RAM は、次の WMI コードを実行することによって検出されます。

var searcher = new ManagementObjectSearcher("Select * from Win32_VideoController");

foreach(ManagementObject videoCard in searcher.Get())
{
    _numVideoCards++;
    foreach (PropertyData propertyData in videoCard.Properties)
    {
        if (propertyData.Name == "AdapterRAM" && propertyData.Value != null)
        {
            _adapterRAM = Math.Max( (UInt32)(propertyData.Value), _adapterRAM );
        }
    }
}

このコードは、私よりも directX をよく知っている人々によって何年も前に書かれました。

問題は、この呼び出しが顧客のハードウェアで予期せず失敗することです (コードの完了後に _adapterRAM == 0 になり、例外がログに記録されます)。

テストを変更したいのですが、ビデオ メモリがこのように直接 DirectX を介して検出される理由があると予想されるため、躊躇しています。

私の質問は 2 つあります。

  • WMIでこれを行う理由を誰かが知っていますか、および/または
  • 物理的なビデオ RAM の量を検出するためのより確実な方法を知っていますか?

PS: 共有メモリ ビデオ カード (Intel など) には興味がありません。それが違いを生む場合は、SlimDX を使用します。

4

1 に答える 1

1

単純に、D3D9 がデバイスの物理メモリの量を公開しないためです。私の知る限り、ベンダーに依存しない唯一のオプションは WMI です。

D3D10 および D3D11 (DXGI を使用) では、構造体のフィールドDedicatedVideoMemoryを使用して取得しますDXGI_ADAPTER_DESC。したがって、Vista または Seven OS をターゲットにしている場合は、これでうまくいくはずです。

オプション (ただし、良くありません) は、OpenGL と独自の拡張機能を使用するGL_ATI_meminfoか、NVAPI のような独自の IHV API を使用し、C++/CLI でそれらの周りに薄いラッパーを作成することです。

于 2010-11-04T15:58:42.627 に答える