2

我有一个基于 .net/DirectX 的渲染库。在程序启动时,我们尝试找出物理视频 RAM 的数量。检测物理视频内存的数量很重要,要知道有多少可以用于纹理(如果你做过认真的directX,你可能已经知道了)。

通过执行以下 WMI 代码来检测视频 RAM:

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 检测显存是有原因的。

我的问题是双重的:

  • 有谁知道你为什么要用 WMI 做这个,和/或
  • 你知道一种更可靠的方法来检测物理视频 RAM 的数量吗?

PS:我们对共享内存显卡(例如英特尔)不感兴趣。如果有什么不同,我们会使用 SlimDX。

4

1 回答 1

1

仅仅是因为 D3D9 不会暴露设备上的物理内存量。据我所知,WMI 是唯一独立于供应商的选项。

使用 D3D10 和 D3D11(利用 DXGI),您可以使用DedicatedVideoMemorystructDXGI_ADAPTER_DESC和voilà 的字段来检索它。因此,如果您的目标是 Vista 或七操作系统,这应该可以工作。

一个选项(但不是很好)是使用 OpenGL 和专有扩展,GL_ATI_meminfo或使用专有的 IHV api,如 NVAPI,并使用 C++/CLI 围绕它们进行薄包装。

于 2010-11-04T15:58:42.627 回答