检测视频内存大小的测试失败

时间:2010-11-04 15:45:03

标签: .net directx wmi video-memory

我有一个基于.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的数量吗?

P.S。:我们对共享内存视频卡(例如英特尔)不感兴趣。如果这会产生影响,我们会使用SlimDX。

1 个答案:

答案 0 :(得分:1)

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

使用D3D10和D3D11(使用DXGI),您可以使用struct DedicatedVideoMemory的字段DXGI_ADAPTER_DESC和voilà来检索它。 因此,如果你的目标是Vista或Seven OS,这应该可行。

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