全部博文(47)
分类: WINDOWS
2009-03-27 16:43:04
这一章介绍了DirectDraw与操作系统和系统硬件之间的关系。包含以下主题:
- DirectDraw结构概览
- DirectDraw对象类型
- 硬件抽象层(HAL)
- 软件仿真层(HEL)
DirectDraw架构概览
多媒体应用程序及游戏需要高表现力的图形引擎。Microsoft公司通过DirectDraw,为广大开发者提供了一个比GDI层次更高、功能更强、操作更有效、速度更快的应用程序图象引擎,与此同时,也努力使其保持了设备无关的优良特性。DirectDraw主要提供了完成以下任务的工具。
除此之外,DirectDraw允许开发者在应用程序运行期测定显示硬件的特性,然后,充分利用主机硬件设备的加速特性为用户提供可能的最优的显示速度和效果。
与DirectX其它组件一样,只要可能,DirectDraw就会最高程度的利用硬件执行某特定功能,并且让那些该硬件还不支持的特性也能用软件仿真的方式加以实现。设备无关性通常是通过硬件抽象层(HAL:Hardware abstraction layer)实现的,要得到更多的关于HAL的资料,请参阅“硬件抽象层(HAL)”。
DirectDraw是通过基于COM的接口提供服务。在DirectX 5.0版本中,这些接口分别是:IDirectDraw2、IDirectDrawSurface3、IDirectDrawPalette、IDirectDrawClipper和IDirectDrawVideoPort。DirectX的这些组件是向下兼容的,它们仍然支持旧版本中的所有功能。要得到更多的关于COM的概念,以有助于理解和创建DirectX应用程序,请参阅“DirectX与部件对象模型(COM)”。
DirectDraw对象代表显示适配器,并且通过IDirectDraw或IDirectDraw2接口将其函数性暴露于开发者。在大多数情况下,开发者使用DirectDrawCreate函数创建一个DirectDraw对象,但也可以通过使用CoCreateInstance COM函数创建之。要得到更的资料,请参阅“用CoCreateInstance创建DirectDraw对象”。
在DirectDraw对象创建好之后,你可以通过使用IDirectDraw2::CreateSurface方法为该DirectDraw对象创建页面。页面代表了位于显示硬件上的内存,但是它既可以存在于视频RAM,也可以存在于系统RAM中。DirectDraw还扩展了对调色板、裁剪(主要用于基于窗口的应用程序)和视频端口(Video port)的支持。
你可以将DirectDraw视为由若干个协同工作的对象所组成。DirectDraw所使用的对象有以下五个:
对象 |
含义 |
DirectDraw |
DirectDraw对象是DirectDraw应用程序的核心。它是你在建立DirectDraw应用程序时所要创建的第一个对象,再用它来创建所有其它相关的对象。通过调用DirectDrawCreate函数可以创建一个DirectDraw对象。DirectDraw对象通过IDirectDraw和IDirectDraw2接口为开发者提供其函数性。要得到更多的资料,请参阅“DirectDraw对象”。 |
DirectDrawSurface |
DirectDrawSurface对象,通常简称为“页面(Surface)”,代表了内存中的一块区域,它存储了可以显示在显示器上的图象数据。通过调用DirectDraw对象的IDirectDraw2::CreateSurface函数可以创建一个与该DirectDraw对象相关联的页面。DirectDrawSurface对象通过IDirectDrawSurface、IdirectDrawSurface2和IDirectDrawSurface3接口为开发者提供其函数性。要得到更多的资料,请参阅“页面”。 |
DirectDrawPalette |
DirectDrawPalette对象,通常简称为“调色板(Palette)”,代表了一个可以为页面所使用的16或256色的调色板。它包含了一组RGB值的索引,用来描述页面上的像素所使用的颜色值。对于像素位深度大于8的页面,不需要使用调色板。通过调用IDirectDraw2::CreatePalette函数,可以创建一个DirectDrawPalette对象。DirectDrawPalette对象通过IDirectDrawPalette接口为开发者提供其函数性。要得到更多的资料,请参阅“调色板”。 |
DirectDrawClipper |
DirectDrawClipper对象,通常简称为“裁剪器(Clipper)”,帮助开发者使Blit(位块传送)操作限定在页面的某一区域内,或不超出页面的边界范围。通过调用IDirectDraw2::CreateClipper函数可以创建一个DirectDrawClipper对象。DirectDrawClipper对象通过IDirectDrawClipper接口为开发者提供其函数性。要得到更多的资料,请参阅“裁剪器”。 |
DirectDrawVideoPort |
DirectDrawVideoPort对象代表了当前某些系统上的视频端口(Vedio port)硬件。这个硬件允许直接的访问帧缓存,而不需要通过CPU或使用PCI总线。通过对DirectDRaw对象调用QueryInterface函数(指定IID_IDDVideoPortContainer标志符),可以创建一个DirectDrawVideoPort对象。DirectDrawVideoPort对象通过IDDVideoPortContainer和IDirectDrawVideoPort接口为开发者提供其函数性。要得到更多的资料,请参阅“视频端口”。 |
DirectDraw通过硬件抽象层(以后简称为:HAL)来提供设备无关的特性。HAL是由设备生产商提供的指定设备的接口,DirectDraw用来直接操作显示硬件。应用程序从来不会直接与HAL打交道,相反,而是与HAL所提供的下属函数打交道。
DirectDraw HAL可以以16位、32位或在Win95中两者兼而有之的形式执行。HAL在WinNT中通常以32位方式执行。HAL可以是显示设备驱动程序的一部分,或独立的DLL,通过驱动程序编写者定义的一个私有接口联系显示驱动。
DirectDraw HAL是由芯片制造商、板卡生产商或原始设备制造商(OEM)实现的。HAL只执行硬件有关代码而不进行仿真。如果硬件不能实现某个功能,HAL不会将其反映在自己的硬件特性中。
当硬件抽象层(HAL)不支持某种特性时,DirectDraw会试图进行软件仿真。仿真的函数是由硬件仿真层(HEL)提供的。HEL与HAL一样,代表了DirectDraw的特性,并且应用程序从来不直接与HEL一起工作。结果是,DirectDraw对硬件的主要特性都提供了透明的支持,而不管这个特性是通过HAL硬件支持的还是通过HEL软件仿真的。
很显然,软件仿真不能与硬件所提供的特性等效。可以调用IDirectDraw2::GetCaps函数以查询硬件支持什么特性。在应用程序初始化的时候检查这些特性,你可以调整应用程序的参数以提供优化的性能。
在有些情况下,硬件特性与软件仿真的组合操作反而会比单纯使用软件仿真效率更低。例如,如果显示设备驱动程序支持DirectDraw,但不支持带缩放的Blit操作,在从视频RAM页面进行带缩放的Blit操作时,将导致明显的速度降低。这是因为有些视频RAM的速度要比系统RAM慢,迫使在访问视频RAM页面的时候,CPU进入等待状态。如果你的应用程序使用硬件不支持的特性,某些时候,在系统RAM中创建页面更为合适,这样才能避免CPU访问视频RAM时的效率损失。
下图展示了DirectDraw,图形设备接口(GDI),硬件抽象层(HAL)和硬件仿真层(HEL)四者之间的关系。
如上图所示,DirectDraw对象与GDI位于同一层次,都通过一个设备相关的抽象层来直接访问硬件设备。与GDI不同的是,DirectDraw会尽可能的利用硬件的加速特性。如果硬件不支持某特性,DirectDraw会使用HEL试图将该特性进行软件仿真。DirectDraw可以以设备环境(DC)的形式提供页面内存,使得开发者可以使用GDI的函数操作页面对象。