游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3112|回复: 3

深入Managed DirectX9(四)

[复制链接]

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2005-1-25 23:09:00 | 显示全部楼层 |阅读模式
呵呵,这几天正在努力的打魔兽,只翻了一点点^_^

仅供个人学习只用,转载请注明作者

选择正确的Device
                The number of possible permutations when cretion a device is quite staggering. 如今,市场里有大量不同类型的显示卡,记住每种显卡所支持的特性几乎时不可能的。你应该询问device,让它告诉你它所支持的特性。我们接下来将讨论:
                        枚举系统里所有的适配器(adapter)
                        枚举每一个device所支持的格式
                        确定所列举的设备功能


枚举系统里的适配器
                如今的大多数系统都支持多显示器。虽然这还不是主流配置,但多显示器确实很有用,并且变的越来越流行。在过去,这是高端图形卡专有的功能。但现在ATI,nVidia以及Matrox都支持让多台显示器共享一块显卡的多头显示技术。
                Direct3D的device必须指定给每一个适配器。在这里,你可以把“适配器”理解为一块链接了特定显示器的显卡。比如ATI Radeon 9700的显卡只是一块物理适配器,但它有两个显示器接口(DVI和VGA),因此,在Direct3D里,它有两个适配器。也许你不知道选哪一个,甚至不确定有多少device在运行游戏的系统里,那么怎样来检测它们并且选择正确的一个呢?
                在Direct3D里,一个叫做Manager的静态类可以简单的完成以上任务:枚举适配器和device的信息;获得系统里device所支持特性的信息。
                Manager类最重要的属性就是适配器的列表。在许多地方都会用到这个属性。它有一个“count”成员储存了系统里适配器的数量。因此,可以直接用索引访问适配器(e.g. Manager.Adapters[0]), 也可以枚举出系统里所有适配器。
                用一个简单的程序测试一下这个功能,它将以树状结构显示出系统里的适配器,以及他们所支持的显示模式:
1.        创建新的C# Windows Formd工程;
2.        添加DirectX组件;
3.        创建一个TreeView控件,并且占满整个窗口:把Dock属性设置为fill
好了,现在该加入扫描每一个适配器,显示所支持的每一种显示模式的函数了:
Public void LoadGRaphics()
{
        foreach(AdapterInformation ai in Manager.Adapters)
        {
                treeNode root = new TreeNOde(ai.Information.Description);
                treeNode driverInfo = new TreeNode(string.Format(“Driver information:{0} ? {1}”, ai.Information.DriverName, ai.Information.DriverVersion) );
                root.Node.Add(driverInfo);
treeNode displayMode ? new TreeNodeJ(string.Format(“Vurrent Display Mode:{0}×{1}×{2}”, ai.CurrentDisplayMode.Width, ai.CurrentDisplayMOde.Height, ai.CurrentDisplayuMode.Format) );
                foreach(DisplayMode dm in ai.SupportedDisplayModes)
                {
                        treeNode supportedNode = new TreeNode(string.Format(“Supported:{0}×{1}×{2}”, dm.Width, dm.Height, dm.Format) );
                        displayMode.Nodes.Add(supportedNode);
                }
root.Nodes.Add(displayMode);
treeView1.Node.Add(root);
}
}
虽然代码看起来有一点点多,但它所做的事情实际上是非常简单的。你可以先分来来看看我们都作了些什么。首先,我们枚举系统里的适配器。C#的Foreach迭代器使这个过程异常的简单。对每一个适配器来说,这个循环都只执行一次,并且用给定的适配器填充AdapterInformation结构。观察一下AdapterInformation结构,有以下几个成员
Public struct AdapterInformation
{
int adapter;
DisplayMode CurrentDisplayMode;
AdapterDetails Information;
AdapterDetails GetWhqlInformation();
DisplayModeEnumerator SupportedDisplayModes;
        }
这里adapter成员指创建device时的适配器序数。序数是一个基于0的索引,并且序数的个数等于系统里适配器的个数。两个返回AdapterDetails结构的成员都使用同一个方法返回同样的结果。对Information成员来说,Windows Hardware Quality Labs(WHQL)并不返回细节,而GetWhqlInformation却可以。获得这些信息要花费一些代价及事件,所以我们把它分成两部分。
AdapterDetails结构保存了适配器的大量信息,包括对适配器自身的描述以及驱动信息。虽然这不是一定会用到的,但应用程序却能依次作出对硬件类型的判断。
剩下的两个成员返回DisplayMode结构。这些结构包含了大量的显示模式,包括显示的高度和宽度,刷新率以及使用的格式。CurrentDisplayMode返回当前的显示模式,SupportedDisplayModes返回适配器所支持的模式的列表。
So,我们用从Information属性获得的对device的描述作为tree view的根节点。然后加入了一个表示驱动程序名字以及版本号的子节点。同样也加入了一个显示当前显示模式的子节点,并且在这个子节点下列出了所有支持的显示模式。
运行程序,可以看到包含了所有支持模式的列表。填充present parameter结构时,这些模式都能当作正确的后备缓冲格式。每一个枚举出来的模式后面都有一个以固定模式显示的字符串(e.g  X8R8G8B8),字母和数字交替出现。字母表示了数据的类型,数字表示这种类型的数据所占的位数。下边是常见的字母:
A??alpha        B??blue                X---unused        L----luminance        R----red         P----palette         G---green
(虽然有很多种格式,但只有几种能正确的用于后备缓冲以及显示模式。可用于后备缓冲的模式包括:A2R10G10B10, A1R5G5B5, A8R8G8B8, X1R5G5B5, X8R8G8B8, R5G5B5; Display formats can be the same as the back buffer formats, with the exception of those that contain an alpha component . The only format that can be used for a display weith alpha is A2R10G10B10,and even then that’s only in full-screen mode.)
每种类型所占的位数加起来,就是这种格式的总大小。比如X8R8G8B8,就是32位的格式,红、绿、蓝各8位,还有8位没有使用。
至今为止,我们获得了要创建的适配器序数,要支持的后备缓冲格式,那么关于device构造函数的其他参数呢?很幸运,Manager类有我们所需的一切。


~~~~~~~~~~~~~待续~~~~~~~~~~~~~~~~~~~~~~~~~
sf_200512523910.jpg

2

主题

11

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2005-1-26 07:11:00 | 显示全部楼层

Re: 深入Managed DirectX9(四)

有没有这本书的原代码,可不可以发上来?

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
 楼主| 发表于 2005-1-26 19:44:00 | 显示全部楼层

Re:深入Managed DirectX9(四)

这张的源码已经传上来了,你去续里看看^_^

0

主题

26

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2005-9-25 21:39:00 | 显示全部楼层

Re:深入Managed DirectX9(四)

谢谢楼主
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 23:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表