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

  • 相关阅读:
    jquery ajax
    对话:工作时常用的借口
    asp.net 加页面Loading效果
    (转)row_number( )、rank( )、,DENSE_RANK( )、ntile( )
    商务英语:出差用语
    怎样工作才能收入更多
    上班族下午如何才不瞌睡?
    (转)系统权限大致分类
    对话:办公室午餐时间
    如何建立一个“铁打的营盘”?
  • 原文地址:https://www.cnblogs.com/clayman/p/1459006.html
Copyright © 2011-2022 走看看