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

  • 相关阅读:
    《算法竞赛入门经典》《算法竞赛入门经典——训练之南》:勘误、讨论及代码
    codeforces 340B Maximal Area Quadrilateral(叉积)
    codeforces 340C Tourist Problem(简单数学题)
    codeforces 340A The Wall(简单数学题)
    UVALive 4043 Ants(二分图完美匹配)
    UVA 11865 Stream My Contest(最小树形图)
    UVA 11354 Bond(最小瓶颈路+倍增)
    UVALive 5713 Qin Shi Huang's National Road System(次小生成树)
    UVALive 3661 Animal Run(最短路解最小割)
    卡尔曼滤波器
  • 原文地址:https://www.cnblogs.com/clayman/p/1459006.html
Copyright © 2011-2022 走看看