DirectDraw对象
DirectDraw对象是DirectDraw应用程序的核心.它是你在建立DirectDraw应用程序时所要创建的第一个对象,再用它来创建所有其它相关的对象.通过调用DirectDrawCreate函数可以创建一个DirectDraw对象.DirectDraw 对象通过IDirectDraw(移动版本仅支持这个),IDirectDraw2,和IDirectDraw4接口为开发者提供其函数性.
DirectDrawSurface对象
DirectDrawSurface对象,通常简称为"页面(Surface)",代表了内存中的一块区域,它存储了可以显示在显示器上的图象数据.通过调用DirectDraw对象的IDirectDraw4::CreateSurface函数可以创建一个与该DirectDraw对象相关联的页面.DirectDrawSurface 对象通过IDirectDrawSurface(移动版本仅支持这个),IDirectDrawSurface2,IDirectDrawSurface3,和IDirectDrawSurface4接口为开发者提供其函数性.
DirectDrawSurface对象和DirectDraw对象什么区别?DirectDraw对象,我们知道是表示整个显示系统,也就是你的 显卡和显屏构成的那个系统,你能在显示器屏幕上直接画点东西吗?不行,显屏上的东西是通过显存和内存操作把里面的东西显示出来,那么相对应于显屏,内存中 就应该有一张矩形白纸供你作画,然后才能把它在显屏上显示。那张白纸就是DirectDrawSurface对象,代表了显存或内存里的一个连续的线性的 数据区。这个数据区可以被代表显示硬件的DirectDraw对象所识别和确认。一般,可以创建的页面有4种,我们常用的有主页面 (primary surface)和离屏页面(offscreen plain)先说主页面,就是一块显存,在主页面中的图形会显示到屏幕中,直接在主 页面上操作会有个问题,数据一多,图象就会不连续,为此可以采用缓冲技术,即建立一个Back buffer(后台缓冲),说白了,就是在内存中再开辟一 块区域,和主页面的区域对应,这样就可以不直接操作主页面,先把数据写入到这里,然后通过换页成为可见。离屏页面不同了,它是和主页面一模一样的画面,但 是它永远不在屏幕上表现出来,通常被用来存储位图,用于将后来的位图图象Blit到主页面或后台缓冲上。
DirectDrawPalette对象
DirectDrawPalette对象,通常简称为"调色板(Palette)",代表了一个可以为页面所使用的16或256色的调色板.它包含了一组RGB值的索引,用来描述页面上的像素所使用的颜色值.对于像素位深度大于8的页面,不需要使用调色板.通过调用IDirectDraw4::CreatePalette函数,可以创建一个DirectDrawPalette对象.DirectDrawPalette 对象通过IDirectDrawPalette接口为开发者提供其函数性.
DirectDrawClipper对象
DirectDrawClipper对象,通常简称为"裁剪器(Clipper)",帮助开发者使Blit(位块传送)操作限定在页面的某一区域内,或不超出页面的边界范围.通过调用IDirectDraw4::CreateClipper函数可以创建一个DirectDrawClipper对象.DirectDrawClipper 对象通过IDirectDrawClipper接口为开发者提供其函数性.
当硬件抽象层(HAL)不支持某种特性时,DirectDraw 会试图进行软件仿真.仿真的函数是由硬件仿真层(HEL)提供的.HEL 与HAL一样,代表了DirectDraw的特性.很显然,软件仿真不能与硬件所提供的特性等效.可以调用IDirectDraw4::GetCaps函数以查询硬件支持什么特性.在应用程序初始化的时候检查这些特性,你可以调整应用程序的参数以提供优化的性能.
下图展示了DirectDraw,图形设备接口(GDI),硬件抽象层(HAL)和硬件仿真层(HEL)四者之间的关系.
DirectDraw核心
这一部分讨论DirectDraw的主要核心内容.相关信息被组织为如下几组:
DirectDraw对象(The DirectDraw Object)
1.控制级描述了DirectDraw是怎样与显示设备相互作用的,它如何对系统事件产生反应.使用IDirectDraw4::SetCooperativeLevel函数可以设置DirectDraw的控制级.最主要的是,你使用DirectDraw控制级来决定你的应用程序是运行于全屏模式(具有独占的访问视频内存的特性),还是运行于窗口模式.任何存在的页面都应该通过调用IDirectDrawSurface4::Restore或IDirectDraw4::RestoreAllSurfaces来恢复,这样它们的内容将在显示之前被重新装载.
2.有两种显示模式:调色板式和非调色板式.对于调色板式显示模式来说,每一个像素的颜色值是以一个相关调色板的索引值来代表.显示模式的位深度决定了调色板中可容纳的颜色数量.举例来说,在8位的调色板显示模式中,每一个像素的值从0到255,该调色板可容纳256个颜色入口.非调色板式显示模式,就象它的名称所表示的那样,不需要使用调色板.在这种显示模式下,像素的位深度为16,24或32,每个像素分别占用2字节,3字节或4字节,用来描述像素的真实颜色.
3. DirectDraw 允许一个进程在需要的时候,可以任意多次的调用DirectDrawCreate函数.每次调用后,返回一个唯一的与设备无关的接口.每一个DirectDraw对象可以随心所欲的使用,在对象与对象之间没有相互依赖的关系.每个对象的行为就象它是由一个唯一的进程创建的.因为DirectDraw对象之间是不相互依赖的,由一个特定的DirectDraw对象创建的DirectDrawSurface, DirectDrawPalette 和DirectDrawClipper对象不应该与其它的DirectDraw对象一起使用,因为这些对象会在它的DirectDraw对象销毁时而自动被释放.如果它们与其它的DirectDraw对象一起使用,调用它们的函数将在它们被销毁时退出.
4.DirectDrawSurface对象,代表了内存里的一个连续的线性的数据区.这个数据区可以被代表显示硬件的DirectDraw对象所识别和确认.DirectDrawSurface 对象代表了一个通常是驻留在显存内的页面,如果显存被用完或被明确地指定它也可以存在于系统内存里.调用IDirectDraw::CreateSurface函数可以创建若干类型的DirectDrawSurface对象,包括单页面对象,复杂页面(complex surface)-换页链,或三维页面.CreateSurface 函数创建我们所请求的页面或换页链,并且返回指向主页面(primary surface)的IDirectDrawSurface接口的指针.
主页面代表的是在显示器的当前可见屏幕,它在页面描述中具有DDSCAPS_PRIMARYSURFACE标志符.对于每一个DirectDraw对象来说,你只可能拥有一个主页面.在移动版本中,仅支持一个后台缓冲页面,复杂页面(含有多个后台缓冲页面链)的形式是不被支持的。实现方式是这样的,先创建一个主页面,然后在该主页面对象上调用EnumAttachedSurfaces()来绑定一个后台缓冲页面用于将来的flip操作。离屏页面(DDSCAPS_OFFSCREENPLAIN)通常被用来存储位图,用于以后将位图图象Blit到主页面或后台缓存上. (移动版本不支持)
DirectDraw里的任何页面都可以构造为换页页面(flipping surfaces).一个换页页面是位于内存里的任何一个可以在前台缓存(front buffer)和后台缓存(back buffer)之间交换的页面,这个换页环境就是我们所称的换页链(flipping chain).在移动版本中,实际上只存在两个页面用于flipping操作。当你调用IDirectDrawSurface::Flip函数以请求一次换页操作,指向主页面和后台缓存的指针相互交换(只改变了页面的指针,数据并未实际移动).这就是说,换页的操作,是通过交换显示设备用来代表页面内存的指针,而不是通过相互复制页面的实际内存来完成的.(当显存不足时情况就不同了)实际上每经历一次flip操作以后主页面与后台缓存的页面指针都会互换,上一次刷新前的后台页面变成了新的主页面。只要在每次update frame(用Timer实现)的循环调用中进行如下操作:1)后台页面对象->GetDC(&hdc)并更新内容 2)主页面调用flip()来显示后台页面的更新结果,并把当前主页面变成后台页面等待下一次的更新操作。
附录
常用DirectDraw接口
在通过DirectDrawCreate创建好DirectDraw对象实例以后,就可以通过调用合适的接口函数来管理他们,以下是一些主要的接口。
1.IDirectDraw
应用程序使用IDirectDraw接口的方法来创建DirectDraw的各种对象,并且与系统层变量一起工作。以下是一些该接口的常用函数参考。
控制级 |
|
创建对象 |
|
设备特性 |
2.IDirectDrawClipper
应用程序使用IDirectDrawClipper接口的函数来管理裁剪表(clip list)。以下是该接口的函数参考。
分配内存 |
|
裁剪表 |
|
窗口句柄 |
3.IDirectDrawPalette
应用程序使用IDirectDrawPalette接口的方法来创建DirectDrawPalette对象,并使其与系统层变量协同工作。以下是该接口的函数参考。
分配内存 |
|
调色板特性 |
|
调色板入口 |
|
4.IDirectDrawSurface
应用程序使用IDirectDrawSurface接口的方法来创建DirectDrawSurface对象,并且与系统层变量一起工作。这部分是关于该接口方法的参考。
分配内存 |
|
隶属页面 |
|
位块传送 |
AlphaBlt |
BltBatch(移动版本没有) |
|
BltFast (移动版本没有) |
|
关键色 |
|
设备环境 |
GetDC-->得到GDI 设备环境句柄(HDC) |
换页 |
|
页面性能 |
|
页面裁剪 |
|
页面描述 |
|
页面调色板 |
|
常用DirectDraw对象结构
1.TheDDCAPSstructure represents the capabilities of the hardware exposed through the DirectDraw object. This structure contains a DDSCAPSstructure used in this context to describe what kinds of DirectDrawSurface objects can be created.
2.TheDDSCAPSstructure defines the capabilities of a DirectDrawSurface object. This structure is part of the DDCAPSand DDSURFACEDESCstructures.
3. The DDSURFACEDESCstructure contains a description of a surface. This structure is passed to the IDirectDraw::CreateSurfacemethod.