在开发图形程序时, 为了保证在各种硬件环境下都有较好的兼容性, 常常需要根据具体的硬件做一些调整, 当然还包括允许用户修改分辨率这种最常见的任务. 那么首先就必须知道硬件所支持的各种特性. 原来的MDX有一个这样的例子, 今天用xna重新写了一遍, 非常简单, 100行代码左右:)
这里要用到2个类: GraphicsAdapter和GraphicsDeviceCapabilities. GraphicsAdapter实际就代表了你的显卡。可以从静态属性Adapters获得当前系统中的所有GPU(如果你有多个GPU的话)信息. 通常索引为0的GPU是系统默认使用GPU。GraphicsAdapter包含了GPU的所有信息,包括型号,名称,驱动版本,制造商等等。SupportedDisplayModes集合包含了所有全屏模式下有效的显示模式。
在GraphicsAdapter的众多方法中,最常用的就是CheckDeviceMultSampleType()和GetCapabilities()。通过前者可以得到当前GPU所支持的多重采样类型和最大采样数。后者则返回包含显卡所有特性(capability)的对象GraphicsDeviceCapabilities. 这个类的所有属性都代表了显卡的某种属性。注意所有以Capabilities结尾的属性都是一个定义在GraphicsDeviceCapabilities名称空间下的结构。
所有特性大概有300多个,类型各不相同。为了显示它们,最简单的方法就是手动编码访问所有属性:) . 当然,我们肯定不会这样做。我们可以使用.net中强大的反射依次访问所有属性:
{
StringBuilder complexCapSb = new StringBuilder(9000);
StringBuilder simpleCapSb = new StringBuilder(1000);
if (e.Node.Parent == null)
{
complexCapSb.Append(e.Node.Text + " capabilities:\r\n");
simpleCapSb.Append("Other capabilities:\r\n");
GraphicsDeviceCapabilities caps = GraphicsAdapter.Adapters[e.Node.Index].GetCapabilities(DeviceType.Hardware);
Type type = typeof(GraphicsDeviceCapabilities);
PropertyInfo[] allCaps = type.GetProperties();
foreach (PropertyInfo prop in allCaps)
{
if( complexCaps.Contains(prop.Name))
{
complexCapSb.Append(prop.Name + ":\r\n");
object capObject = prop.GetValue(caps, null);
Type subCapType = capObject.GetType();
PropertyInfo[] complexCapProps = subCapType.GetProperties();
foreach (PropertyInfo complexPropCap in complexCapProps)
{
complexCapSb.Append(" " + complexPropCap.Name + ": " + complexPropCap.GetValue(capObject, null).ToString() + "\r\n");
}
complexCapSb.Append("\r\n");
}
else
{
object value = prop.GetValue(caps, null);
simpleCapSb.Append(" " + prop.Name + ": " + value.ToString() + "\r\n");
}
}
}
complexCapSb.Append(simpleCapSb);
deviceCapTbx.Text = complexCapSb.ToString();
}
完整的代码可以到这里下载,需要vs2008 和xna 3.0