在开发图形程序时, 为了保证在各种硬件环境下都有较好的兼容性, 常常需要根据具体的硬件做一些调整, 当然还包括允许用户修改分辨率这种最常见的任务. 那么首先就必须知道硬件所支持的各种特性. 原来的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中强大的反射依次访问所有属性
- void adapterInfoTrv_AfterSelect(object sender, TreeViewEventArgs e)
- {
- 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