zoukankan      html  css  js  c++  java
  • 用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中强大的反射依次访问所有属性:

    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

  • 相关阅读:
    C/C++通过WMI和系统API函数获取获取系统硬件配置信息
    C++ 获取mac地址
    解决Win7下UAC开启时无法响应WM_DROPFILES消息
    C++vector迭代器失效的问题
    解决Duilib创建的win32窗口拖到屏幕上边缘自动最大化
    VC++获取计算机Hardware Information (CPU ID, MainBoard Info, Hard Disk Serial, System Information)
    VC++实现在系统托盘来新消息闪烁,鼠标悬停显示窗口
    正则表达式的懒惰匹配?
    thinkphp-许愿墙-3
    thinkphp-许愿墙-2
  • 原文地址:https://www.cnblogs.com/clayman/p/1459006.html
Copyright © 2011-2022 走看看