Clayman's Graphics Corner

DirectX,Shader & Game Engine Programming

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

 

posted on 2009-05-17 22:44  clayman  阅读(933)  评论(0编辑  收藏  举报