⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dx5.txt

📁 我下的时候觉得好编程类的
💻 TXT
📖 第 1 页 / 共 5 页
字号:
二、DirectDraw的体系
    多媒体软件要求高性能的图象。通过DirectDraw,Microsoft使得对图象敏感性的程序在速度和效率上都比在GDI上有了大大是提高,
同时又保持了设备无关性,DirectDraw提供的工具能完成如下的关键任务:
	.操作多个显示表面
	.直接存取视频内存
	.页翻转
	.后台缓冲
	.调色板的管理
	.剪切
另外,DirectDraw在运行时允许你查询显示硬件的性能然后提供显示设备所能够支持的最佳效能。
    DirectDraw提供了基于COM的服务接口,使用最多的是IDirectDraw2、IDirectDrawSurface3、IDirectDrawPalette、IDirectDrawClipper和
IDirectDrawVideoPort。除了这些接口外,DirectDraw继续支持以前版本的接口。
    DirectDraw对象表征了显示适配器,通过IDirectDraw和IDirectDraw2接口揭示其方法。在大多数情况下,你可以使用DirectDrawCreate
函数来创建一个DirectDraw对象,也可以使用COM函数CoCreateInstance。 
创建了DirectDraw对象后,你可以调用IDirectDraw2::CreateSurface方法为该对象创建表面。表面表征了显示硬件上的内存,既可以是视频
内存,也可以是系统内存。DirectDraw通过其它的接口扩展了对调色板、剪切及视频端口的支持。

1、DirectDraw的对象类型
    DirectDraw对象既可以是一个单独的对象,也可以是几个对象的组合。最新版本的DirectDraw有以下类型的对象:
1.1、DirectDraw对象
    DirectDraw对象是DirectDraw应用程序的核心,它是你创建的第一个对象。创建了DirectDraw对象后,可以在它的基础上创建其它所
有相关的对象。创建DirectDraw对象的函数是DirectDrawCreate。 
1.2、DirectDrawSurface对象
    DirectDrawSurface对象表征了一块内存区域,在该区域的数据将作为图象显示在屏幕上或移动到其它表面上。创建DirectDrawSurface
对象的方法是 IDirectDraw2::CreateSurface,其它相关的方法可通过接口 IDirectDrawSurface, IDirectDrawSurface2和IDirectDrawSurface3得
到。
1.3、DirectDrawPalette对象
    DirectDrawPalette对象(有时也指的是“palette”)表征了一个用于表面的16色或256色的索引调色板,它包含了一系列描述同表面相
关的RGB颜色索引值。创建DirectDrawPalette对象的方法是IDirectDraw2::CreatePalette。可以从接口IDirectDrawPalette获取其它的方法。
1.4、DirectDrawClipper对象
    DirectDrawClipper对象(有时指的是“clipper”)帮助你禁止向表面的某一位置或超出表面的位置块写数据,创建DirectDrawClipper的
方法是 IDirectDraw2::CreateClipper,其它相关的方法可从接口 IDirectDrawClipper中获取。
1.5、DirectDrawVideoPort对象
    DirectDrawVideoPort对象表征了一些系统只具有的视频端口硬件,该硬件允许直接访问帧缓冲区而不需要访问CPU或使用PCI总线。
你可以先指定IDDVideoPortContainer标志,再调用QueryInterface方法来创建 DirectDrawVideoPort对象。其它相关的方法可从接口
IDDVideoPortContainer和IDirectDrawVideoPort中获得。

2、硬件抽象层HAL(Hardware Abstraction Layer)
    DirectDraw通过硬件抽象层HAL提供了设备无关性。HAL是一种特殊的设备接口,由设备生产厂商提供。DirectDraw利用HAL直接
在显示设备上工作。应用程序并不同HAL交互。设备制造厂商以Windows95下的16位或32位代码的形式提供HAL,在WindowsNT下,
HAL是32位代码。HAL可以是显示驱动程序的一部分,也可以是通过制造商定义的私有接口同显示驱动程序通信的动态链接库DLL。
DirectDraw HAL由芯片、板卡或OEM(Original Equipment Manufacturer)提供。HAL只提供了设备相关性代码,执行时没有仿真。如果一种
功能不被硬件支持,HAL将不把该功能作为硬件性能的一部分处理。另外,HAL不对参数进行证实,DirectDraw会在调用HAL之前完成参
数的证实工作。

3、软件仿真(Software Emulation)
    当硬件HAL不支持某一特性时,DirectDraw就尝试用软件来仿真这一特性。该仿真功能是由硬件仿真层HEL(Hardware-Emulation Layer)
提供的。显然,软件仿真并不等同于硬件本身具有的特性。你可以用IDirectDraw2::GetCaps方法来查询硬件所支持的特性。
    有时,硬件固有的特性和软件仿真二者的结合比单独使用软件仿真的速度还要慢。例如,如果显示设备驱动程序支持DirectDraw但不支
持拉伸块写方式,当从视频内存表面拉伸或位块传输时就会产生性能上的损失。因为视频内存通常比系统内存的速度要慢,在访问视频内存
时CPU必须要等待。因此,如果你的应用程序使用了硬件未能提供的特性,最好在系统内存中创建表面,以避免CPU访问视频内存时出现
的性能损失情况。

4、系统组成(System Integration)
    下图显示了DirectDraw、图形设备接口GDI、硬件抽象层HAL、硬件仿真层HEL和硬件之间的关系。
 
如图中所示,一个DirectDraw对象同GDI是并列关系,两者都通过设备相关抽象层访问硬件。同GDI不同的是,DirectDraw只要有可能就
会充分利用硬件提供的特有功能。如果硬件不支持某一特性,DirectDraw还会尝试用HEL来仿真。DirectDraw也能以设备上下文(Device 
Context)的形式提供表面内存,是你能够使用GDI函数来处理表面对象。

三、DirectDraw的要素
    DirectDraw中最基本的要素有协作等级、显示模式、DirectDraw对象、表面、调色板、剪切板等,下面对各个要素逐一进行介绍。
1、协作等级(Cooperative Level)
   协作等级描述了DirectDraw如何同显示交互及对那些可能影响显示的事件的反应。你可以使用IDirectDraw2::SetCooperativeLevel方法来
设置协作等级。在大多数的情况下,你可以使用协作等级来确定应用程序是否运行在独占全屏模式或窗口模式。DirectDraw协作等级还具有
以下作用:
	.使DirectDraw能够使用X模式(Mode X)分辨率。
	.如果用户按了ctrl + alt + del,禁止DirectDraw释放对显示的独占控制和重新启动(仅在独占模式下)。
	.使DirectDraw能够最大化和最小化以响应激活的事件。
    标准的协作等级指明了DirectDraw程序是一个窗口应用程序。在这种情况下,你不能改变主表面的调色板和执行页翻转。另外,你还不
能调用那些对显示或视频内存影响程度大的方法,如 IDirectDraw2::Compact等。
在全屏独占协作等级下,你可以使用硬件的所有性能,设置惯用调色板和动态调色板,改变显示分辨率,紧凑内存和实现页翻转等。全屏独
占模式不禁止其它的应用分配表面,也不禁止它们使用DirectDraw和GDI,但禁止其它发应用改变显示分辨率和调色板。
    因为应用程序可以在多窗口使用DirectDraw,所以当应用要求工作在DDSCL_NORMAL模式时,IDirectDraw2:: SetCooperativeLevel方
法并不需要一个指定的窗口句柄。将NULL传递给窗口句柄,所有的窗口都能同时工作在标准窗口模式下。

2、显示模式(Display Modes)
    显示模式是对显示硬件从主表面传送给显示器的图象的大小和位深度(bit-depth)的描述。显示模式可以刻画为:宽、高和位深度。例
如,大多数的显示适配器都能显示宽640个像素,高480个像素,每个像素的颜色值为8位的数据图象,该显示模式就几为640x480x256。
要想得到更大的分辨率或位深度,就需要更多的显示内存。
    显示模式有两种类型:调色模式和非调色模式。对于调色显示模式,每一个像素都是一个指向相关调色板的索引值。显示模式的位深度
决定了调色板中能够具有的颜色的数目。例如,对于8位调色显示模式,每一个像素都是一个从0到255的值。在这种显示模式下,调色板
可以包含256中颜色。非调色显示模式则不使用调色板,该模式下的位深度指明了用于描述一个像素的总的位数。
    主表面和主翻转链中的任何表面都应该和显示模式的大小、位深度和像素格式匹配。
2.1、检测所支持的显示模式
    因为显示硬件的不同,并不是所有的设备都支持所有的显示模式。要检测系统所支持的显示模式,需要调用
IDirectDraw2::EnumDisplayModes方法。通过设定适当的值和标志, IDirectDraw2::EnumDisplayModes方法可以列出所有支持的显示模式,
也能判断是否支持某一指定的显示模式。
    该方法的第一个参数dwFlags控制方法其它的选项,通常可以将dwFlags设为0来忽略其它的选项;第二个参数lpDDSurfaceDesc是用
以描述所给显示模式的结构 DDSURFACEDESC的地址,一般将其设为NULL可以列出所有的模式。第三个参数lpContext是一个指针,
DirectDraw需要将该指针传递给回调函数,如果不需要在回调函数中有额外的数据,可将其设为NULL。最后一个参数是
lpEnumModesCallback,它是DirectDraw对于每一种支持的显示模式调用的回调函数的地址。
    在调用IDirectDraw2::EnumDisplayModes方法时提供的回调函数必须同EnumModesCallback函数的原型相匹配。对于硬件所支持的每一
种显示模式,DirectDraw调用你的回调函数来传递两个参数,第一个是DDSURFACEDESC结构的地址,该结构描述了一种支持的显示模式;
第二个参数是调用IDirectDraw2::EnumDisplayModes时指定的应用定义的数据的地址。
    通过检查DDSURFACEDESC结构的值来得到它所描述的显示模式,其中关键的成员是dwWidth、dwHeight、和ddpfPixelFormat。dwWidth
和dwHeight描述了显示模式的大小;ddpfPixelFormat是一个DDPIXELFORMAT结构,它包含了有关位深度的信息。
    DDPIXELFORMAT结构包含了描述显示模式位深度的信息,并且说明该显示模式是否使用调色板。如果dwFlags成员包含了 
DDPF_PALETTEINDEXED1、DDPF_PALETTEINDEXED2、DDPF_PALETTEINDEXED4或DDPF_PALETTEINDEXED8标志,该显示模式
的位深度就是1、2、4或8位,并且每个像素都是一个相公调色板的索引。如果dwFlags包含了DDPF_RGB标志,该显示模式就是非调色
显示模式,并且其位深度由DDPIXELFORMAT结构中的dwRGBBitCount成员提供。
2.2、设置显示模式
    你可以调用IDirectDraw2::SetDisplayMode方法来设置显示模式。该方法接受四个参数来设置显示模式的分辨率的大小、位深度和刷新
率。它使用第五个参数来指定给定模式的特殊选项,目前仅用于13模式和X模式320x200x8中。
    你可以指定期望得到的显示模式的位深度,但不能指定显示硬件用于该位深度的像素格式。要检测显示硬件用于当前位深度的RGB位
屏蔽,可以在设置显示模式后调用 IDirectDraw2::GetDisplayMode方法。如果当前显示模式是非调色模式,你可以通过检查dwRBitMask、
dwGBitMask和dwBBitMask中的值来获得教正的红、绿、蓝颜色位。
    你还可以通过多个应用来改变显示模式,只要它们都共享同一个显示卡。也可以改变位深度,只要应用程序能独占式地访问DirectDraw
对象,所有的DirectDrawSurface对象在显示模式改变后都会释放表面内存,所以在更改了显示模式之后,必须使用 IDirectDrawSurface3::Restore
方法重新为对象分配表面内存。
2.3、恢复显示模式
    如果显示模式是通过调用IDirectDraw2::SetDisplayMode方法(而不是 IDirectDraw::SetDisplayMode方法)完成的,你可以调用
IDirectDraw2::RestoreDisplayMode方法来恢复到原来的显示模式。如果应用程序是独占式的协作等级,当你将应用程序的协作等级设回标准
时,显示模式就会自动恢复为原来的模式。如果使用了DirectDraw接口,你必须显式地恢复显示模式。
2.4、X模式和13模式
    DirectDraw支持X模式和13模式两类显示模式。13模式是320x200,每个像素是8位的调色模式,其16进制BIOS模式号为13。模式
X是从标准的VGA 13模式衍生出来的混合模式,该模式允许使用256KB的显示内存(13模式仅允许实用64KB的显示内存)。
    在Windows95下,DirectDraw对所有的显示卡提供两种X模式(320x200x8和320x240x8)。一些显示卡也支持线性低分辨率模式,在
线性低分辨率默默上下,主表面能够被锁定也能直接访问,这在X模式下是不允许的。
   只要应用程序调用IDirectDraw2::SetCooperativeLevel方法时使用了 DDSCL_ALLOWMODEX,、DDSCL_FULLSCREEN和
DDSCL_EXCLUSIVE标志,X模式就可用。如果没有指定 DDSCL_ALLOWMODEX标志, IDirectDraw2::EnumDisplayModes方法就不能
列出X模式,当请求X模式时,对IDirectDraw2::SetDisplayMode方法的调用就会失败。 
    当应用程序在X模式时不能使用IDirectDrawSurface3::Lock或IDirectDrawSurface3::Blt方法锁定主表面或向主表面块写数据,也不能在
主表面或屏幕DC的GDI使用 IDirectDrawSurface3::GetDC方法。X模式由DDSCAPS肩胛骨中的DDSCAPS_MODEX标志来指定,DDSCAPS
结构是调用IDirectDrawSurface3::GetCaps和IDirectDraw2::EnumDisplayModes方法返回的DDSURFACEDESC结构中的一部分。
2.5、高分辨率和真彩色
     DirectDraw支持由显示设备驱动程序支持的所有的屏幕分辨率和位深度。DirectDraw允许应用程序改变显示模式到任一种计算机显示
驱动程序支持的显示模式,包括24位和32位(真彩色)模式。
     DirectDraw也支持真彩色表面的HEL位块传输。如果显示设备驱动程序在这些分辨率下支持位块传输,显示内存──显示内存的位块
传输将使用硬件块写方式,否则将使用HEL来提高位块传输的性能。
     Windows95和NT允许你指定正在使用的显示器的类型。DirectDraw检查已知显示模式的列表,如果DirectDraw检测到要求的模式同
该显示器不兼容,对 IDirectDraw2::SetDisplayMode方法的调用将会失败。当你调用方法IDirectDraw2::EnumDisplayModes时,只有显示器
支持的模式才会被列出来。

3、DirectDraw对象
     DirectDraw对象是所有DirectDraw应用程序的核心,也是Direct3D应用程序的一个有机组成部分。DirectDraw对象是你创建的第一个
对象,通过该对象再创建其它相关对象。一般通过调用DirectDrawCreate函数来创建一个DirectDraw对象,该函数返回一个IDirectDraw接

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -