二、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函数来处理表面对象。