用XNA显示GPU系统信息


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

  1. void adapterInfoTrv_AfterSelect(object sender, TreeViewEventArgs e)
  2. {
  3.     StringBuilder complexCapSb = new StringBuilder(9000);
  4.     StringBuilder simpleCapSb = new StringBuilder(1000);
  5.     if (e.Node.Parent == null)
  6.     {
  7.         complexCapSb.Append(e.Node.Text + " capabilities:/r/n");
  8.         simpleCapSb.Append("Other capabilities:/r/n");
  9.        GraphicsDeviceCapabilities caps = GraphicsAdapter.Adapters[e.Node.Index].GetCapabilities(DeviceType.Hardware);
  10.        Type type = typeof(GraphicsDeviceCapabilities);
  11.        PropertyInfo[] allCaps = type.GetProperties();
  12.        foreach (PropertyInfo prop in allCaps)
  13.        {
  14.            if( complexCaps.Contains(prop.Name))
  15.            {
  16.                complexCapSb.Append(prop.Name + ":/r/n");
  17.                object capObject = prop.GetValue(caps, null);
  18.                Type subCapType = capObject.GetType();
  19.                PropertyInfo[] complexCapProps = subCapType.GetProperties();
  20.                foreach (PropertyInfo complexPropCap in complexCapProps)
  21.                {
  22.                    complexCapSb.Append("  " + complexPropCap.Name + ": " + complexPropCap.GetValue(capObject, null).ToString() + "/r/n");
  23.                }
  24.                complexCapSb.Append("/r/n");
  25.            }
  26.            else
  27.            {
  28.                object value = prop.GetValue(caps, null);
  29.                simpleCapSb.Append(" " + prop.Name + ": " + value.ToString() + "/r/n");
  30.            }
  31.        }
  32.     }
  33.     complexCapSb.Append(simpleCapSb);
  34.     deviceCapTbx.Text = complexCapSb.ToString();
  35. }

       完整的代码可以到这里下载,需要vs2008 和xna 3.0

 

你可能感兴趣的:(.net,制造,null,任务,图形)