我有一个基于.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。
我的问题有两个:
P.S。:我们对共享内存视频卡(例如英特尔)不感兴趣。如果这会产生影响,我们会使用SlimDX。
答案 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围绕它们做一个薄的包装。