DirectDraw 结构

这部分主要包括 DirectDraw 组成, 操作系统及系统硬件之间联系. 有以下一些主题:

结构纵观

  多媒体软件需要高度优化的图形. 通过DirectDraw, Microsoft 使在Windows上的应用程序获得一个高级有效率高速的图形操作变为可能, 硬件系统可以的话, DirectDraw将提供以下一些功能:

  另外DirectDraw使你在运行时对硬件性能进行查询, 从而相对系统硬件给予最大优化.

  DirectDraw 会使用一切硬件功能, 并在硬件不支持的特性时给予软件虚拟. 系统会尽量使用硬件操作层(HAL), 详见硬件操作层(HAL)

  DirectDraw 组件是通过基于COM接口进行服务的. 最新的接口是IDirectDraw4, IDirectDrawSurface4, IDirectDrawPalette, IDirectDrawClipper及IDirectDrawVideoPort. 注意: 在这些新的接口之前的老接口, DirectDraw仍然支持. DirectDraw组件并不包含IDirectDraw3接口, 接口版本从IDirectDraw2跳到IDirectDraw4.

  DirectDraw通过IDirectDraw, IDirectDraw2, IDirectDraw4接口来操作显示适配器. 大多数情况下你要使用DirectDrawCreate函数来创建一个DirectDraw对象, 也可用CoCreateInstance COM函数来创建. 详见用CoCreateInstance来创建DirectDraw对象.

  在创建好DirectDraw 对象后就可以用IDirectDraw4::CreateSurface宏来创建一个平面. 平面将显存的内容表现出来, 也可以表现系统内存. DirectDraw 的其他接口扩展了调色板的支持, 剪切(使用在窗口式应用程序), 及视频端口.

DirectDraw 对象类型

  你可以这样想, DirectDraw是由多个对象协同工作. 这部分简单介绍了你将要使用的对象. 详见DirectDraw核心.

硬件操作层(HAL)

  DirectDraw 通过硬件操作层(HAL)提供设备索引. HAL是特殊设备接口, 由硬件厂商提供, DirectDraw可以直接操作硬件. 程序无须与HAL进行接触. 相反, 通过HAL提供的基础结构, DirectDraw使用相同的结构让应用程序来显示图形. 硬件制造商在Windows下实现的HAL包含16-bit及32-bit的代码. 在Windows NT下, HAL则是纯32-bit的代码. HAL可以是显示卡驱动程序的一部分或单独的动态衔接库(DLL), 以驱动程序的接口来通信, 接口是由驱动程序设计者定义的.

  DirectDraw 的HAL是有晶片制造商、主要生产者及 OEM(Original Equipment Manufacturer) 所创建的. HAL完全依靠设备优化. 如果硬件不支持某个功能, HAL并不会报告. 另外HAL不验证传递的参数. DirectDraw就是在调用HAL之前完成这些工作的.

软件摸拟

  当通过硬件操作层(HAL)硬件无法支持某些特性, DirectDraw 就试图对其进行模拟. 这个功能是通过硬件模拟层 (Hardware Emulation Layer [HEL]) 来实现的. HEL提供的与HAL相同的功能. 还有, 在HAL, 程序并不直接与HEL工作. 在主要功能上其结果大体相同, 而程序不必理会是由硬件提供的还是HEL模拟的.

  很明显, 软件模拟在性能上无法与硬件提供特性相比. 你可以用 IDirectDraw4::GetCaps 宏来查询硬件支持的特性. 通过初始化时的查询, 你可以适当改变参数来对不同性能的硬件进行优化.

  但有时硬件操作与软件摸拟的组合反而比用纯软件模拟更慢. 例如: 显示驱动程序支持 DirectDraw 但不支持伸拉位图 (Stretch Blitting), 明显会在用显存进行伸拉位图时损失性能. 因为通常显存会比系统内存慢, 在操作显存时会使CPU处于等待状态. 如果程序并不使用硬件支持的特性, 有时在系统内存上创建平面更好, 从而绕过CPU在操作显存时的性能损失. 详见硬件操作层.

系统组成

  下面这幅图显示了DirectDraw, 图形设备接口 (Graphics Device Interface[GDI]), 硬件操作层(Hardware Abstraction Layer[HAL]), 硬件模拟层 (Hardware Emulation Layer[HEL] 及硬件(Hardware)之间的关系.

关系图(3656字节)

  就象上图所显示, DirectDraw对象与GDI并排存在, 并且各自有操作硬件的设备操作层. 不象GDI, DirectDraw会使用特殊硬件特性如果可以的话. 如果硬件不支持, DirectDraw就会用HEL对其进行模拟. DirectDraw可以提供平面内存的设备文本, 使你用GDI函数对平面对象操作变为可能.


上篇|返回|下篇

Lucker 1999.1.2
E-Mail: fred_cai@kali.com.cn


云风工作室 制作