Chinaunix首页 | 论坛 | 博客
  • 博客访问: 488547
  • 博文数量: 78
  • 博客积分: 5131
  • 博客等级: 大校
  • 技术积分: 1468
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-17 16:20
文章分类
文章存档

2012年(1)

2011年(29)

2010年(6)

2009年(24)

2008年(18)

我的朋友

分类: LINUX

2008-03-26 14:50:17

 DirectDraw是DirectX SDK的主要部分之一,它允许你
直接对显示内存操作,支持硬件位块传输、硬件覆盖、表面
翻转,并且保持同目前的基于Windows的应用程序和驱动程
序兼容。
    DirectDraw是一种软件接口,它除了能直接对显示设备
存取外,还保持同Windows图形设备接口GDI(Graphics 
Device Interface)兼容。对于图形来说,它并不是一种高
级应用程序接口。DirectDraw提供了一种设备无关性的方法,
使得基于Windows的应用软件和游戏(例如三维图形软件包和
数字视频游戏)能直接获取显示设备的特性。
    DirectDraw能工作于各种各样的显示设备,从简单的
SVGA显示器到能够提供剪切、拉伸和非RGB格式支持的高级显
示设备。DirectDraw接口使得你的应用程序能仿真基本硬件
的性能并使用硬件加速特性;硬件不提供的特性将由DirectX
来仿真。DirectDraw提供的对显示内存的设备无关性的访问
能使你很容易地管理显示内存。你的应用程序只需要识别一
些基本的设备属性,它们都是标准的硬件应用,例如RGB和
YUV格式的颜色。你不需要调用特殊的过程来使用位块传输或
操纵调色板寄存器。使用DirectDraw,你可以很容易地操作
显示内存,充分利用不同类型显示设备的位块传输和颜色解
压功能,而不需要依赖于特定的硬件。DirectDraw可以运行
在Windows95/NT4.0和以后的版本中。
    DirectDraw的硬件抽象层HAL(Hardware Abstraction
 Layer)提供了统一的接口,通过该接口,程序可以直接在
显示内存或视频内存中工作,获取硬件的最佳性能。
    DirectDraw对视频硬件的性能进行估计,只要可能就会
使用硬件提供的特定性能。例如,如果视频卡支持位块传输,
DirectDraw就会把位块传输委托给视频卡,CPU不参与位块传
输的处理,这就大大提高了程序运行的性能。另外,
DirectDraw提供了硬件仿真层HEL(Hardware Emulation Layer),
使得在某些硬件不存在时可以用软件仿真来支持本应该由这
些硬件提供的特性。
    DirectDraw运行在Windows 95上,能够利用32位内存的
优越性和操作系统提供的"平坦"内存模型。DirectDraw将系
统内存和视频内存作为大块存储而不是一小段一小段地使用。
另外,DirectDraw还为 Windows图形程序员带来了许多强大
的功能:
  .DirectDraw使得在全屏模式下的应用多个后台缓冲区的
页翻转变得容易
  .支持窗口模式和全屏模式下的剪切功能
  .支持三维 Z缓冲区
  .支持Z方向的硬件辅助覆盖
  .提供对图象拉伸的硬件的存取
  .同时访问标准的和增强的显示设备内存区域
  .动态调色板、独占式的硬件访问、分辨率切换等
将这些特性结合在一起,你就可以较容易地编制出性能超过
基于GDI的标准Windows游戏甚至是MS-DOS下的游戏。

一、DirectDraw的基本图象概念
    DirectDraw提供了一组不同于GDI的图形术语,因此,
要用好DirectDraw,首先应该了解其中的有关概念。下面就
对DirectDraw中重要的概念作一介绍。
1.1设备无关性位图DIB(Device-Independent Bitmap)
     DirectX使用设备无关性位图DIB作为主要的图形文件
格式。一个DIB文件主要保护了如下信息:图象的维数、使
用的颜色数、描述颜色的值及描述每一个像素的数据。DIB
文件还保护了较少用到的参数,象有关文件压缩的信息和
图象的物理维数。DIB文件的扩展名一般是".BMP",有时也
可能是".DIB"。
    因为DIB在Windows编程中的应用极其广泛,DirectX S
DK已经包含了许多相关的函数。例如,DirectX SDK提供的
ddutil.cpp文件中有一个函数,它将Win32和DirectX函数结
合在一起,概念是把一个DIB文件装入DirectX表面
 
1.2、绘图表面(Drawing Surface)
    绘图表面接受视频数据并将其作为图象显示出来。在大
多数的Windows应用程序中,你可以使用Win32的函数如Get
DC来访问绘图表面。GetDC获取设备上下文DC(Device Context),
获得了设备上下文后,就可以重画表面了。然而,Win32的图象函
数是由GDI提供的。GDI是系统的一部分,它提供了抽象层,使得
标准的Windows程序向表面绘图。
    GDI的缺点是它并不是为高性能的多媒体软件设计的,它主要
用于商业软件如字处理和电子表格软件。GDI提供了对系统内存中
的视频缓冲区的访问,但不提供对视频内存的访问。尽管GDI对于
大多数的商业软件非常合适,但对于多媒体应用程序和游戏软件
则显得太慢了。
    另一方面,DirectDraw 能提供表征真实视频内存的绘图表面,
这就意味着当你使用DirectDraw 时,你能够直接向视频内存写数
据,使得图象的显示速度足够快。这些表面表征为连续的内存块,
使得寻址时更加容易。
1.3、位块传输Blit
   Blit是"Bit Block Transfer"的简写,表示位块传输。
它是将内存中一个地址的一块数据传送到另一个地址的一种
方法。位块传输经常用于精灵动画中。你可以使用
IDirectDrawSurface3::Blt 方法和IDirectDrawSurface3::
BltFast方法来执行位块传输。


1.4、页翻转(Page Flipping)和后台缓冲(Back Buffer
ing)
    页翻转是多媒体、动画、游戏软件中的关键。软件页翻
转是对卡通画家使图象运动的过程的模拟。例如,画家在一
张纸上画了一个人物,然后将其置于下一帧的工作状态,对
于每一帧,只很少地改变人物图象。当你快速翻转纸片时,
连续的人物图象看起来就成了动画。
    软件中的页翻转类似于上述的过程。首先,你建立了一
系列DirectDraw表面,这些设计好的表面准备"翻转"到屏幕。
第一个表面被看作是主表面(Primary Surface),在主表面
后的所有表面都称为后台缓冲区。应用程序将数据写向后台
缓冲区,然后翻转主表面,于是后台缓冲区就显示在片面上
了。当系统正在显示图象时,程序就可以向后台缓冲区写数
据,这个过程一直持续到动画的结束,它使你快速而高效地
将离散的图象变成动画。 DirectDraw可以利用相对简单一
些的双缓冲区(一个主表面和一个后台缓冲区),也可以使
用较复杂的技术,加入其它的后台缓冲区。使得你能够容易
地建立页翻转的程序。


1.5、矩形(Rectangle)
    贯穿DirectDraw和Windows编程的一个最重要的概念是
表面上的对象──有界矩形。一个有界矩形由两个点来确定
,即左上角和右下角。当以位块传输的方式向屏幕写数据时,
大多数的应用程序都使用RECT结构来传送有关有界矩形的信
息。RECT结构的定义如下:
typedef struct tagRECT { 
    LONG    left;    // This is the top-left corner's 
X-coordinate.
    LONG    top;     // The top-left corner's Y-coordinate.
    LONG    right;   // The bottom-right corner's X-coordinate.
    LONG    bottom;  // The bottom-right corner's Y-coordinate.
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT; 

    其中left和top成员变量是矩形左上角的X、Y坐标的值,
right和bottom是右下角的X、Y的坐标值。
阅读(2142) | 评论(0) | 转发(0) |
0

上一篇:DirectDraw与DirectInput

下一篇:fstat() 函数

给主人留下些什么吧!~~