DirectDraw读书笔记

简介: <p align="LEFT" style="margin-bottom:0cm"><span style="color:#000000"><span style="font-family:Times-Roman,serif"><span style="font-size:14px"><strong>DirectDraw</strong></span></span></span><span

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)",代表了一个可以为页面所使用的16256色的调色板.它包含了一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的主要核心内容.相关信息被组织为如下几组:

控制级(Cooperative Levels)

显示模式(Display Modes)

DirectDraw对象(The DirectDraw Object)

页面(Sufaces)

调色板(Palettes)

裁剪器(Clippers)

1.控制级描述了DirectDraw是怎样与显示设备相互作用的,它如何对系统事件产生反应.使用IDirectDraw4::SetCooperativeLevel函数可以设置DirectDraw的控制.最主要的是,你使用DirectDraw控制级来决定你的应用程序是运行于全屏模式(具有独占的访问视频内存的特性),还是运行于窗口模式.任何存在的页面都应该通过调用IDirectDrawSurface4::RestoreIDirectDraw4::RestoreAllSurfaces来恢复,这样它们的内容将在显示之前被重新装载.

2.有两种显示模式:调色板式和非调色板式.对于调色板式显示模式来说,每一个像素的颜色值是以一个相关调色板的索引值来代表.显示模式的位深度决定了调色板中可容纳的颜色数量.举例来说,8位的调色板显示模式中,每一个像素的值从0255,该调色板可容纳256颜色入口.调色板式显示模式,就象它的名称所表示的那,不需要使用调色板.这种显示模式下,像素的位深度16,2432,每个像素分别占用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的各种对象,并且与系统层变量一起工作。以下是一些该接口的常用函数参考。

控制

SetCooperativeLevel

TestCooperativeLevel

创建对象

CreateClipper

CreatePalette


CreateSurface

设备特性

GetCaps

2.IDirectDrawClipper

应用程序使用IDirectDrawClipper接口的函数来管理裁剪表(clip list)以下是该接口的函数参考。

分配内存

Initialize

裁剪表

GetClipList

IsClipListChanged


SetClipList


SetHWnd

窗口句柄

GetHWnd

3.IDirectDrawPalette

应用程序使用IDirectDrawPalette接口的方法来创建DirectDrawPalette对象,并使其与系统层变量协同工作。以下是该接口的函数参考。

分配内存

Initialize

调色板特性

GetCaps

调色板入口

GetEntries

SetEntries

4.IDirectDrawSurface

应用程序使用IDirectDrawSurface接口的方法来创建DirectDrawSurface对象,并且与系统层变量一起工作。这部分是关于该接口方法的参考。

分配内存

Initialize

IsLost


Restore

隶属页面

AddAttachedSurface

DeleteAttachedSurface


EnumAttachedSurfaces


GetAttachedSurface

块传送

Blt

AlphaBlt

BltBatch(版本没有)


BltFast (版本没有)


GetBltStatus

键色

GetColorKey

SetColorKey

设备环境

GetDC-->得到GDI 设备环境句柄(HDC)  

ReleaseDC

换页

Flip

GetFlipStatus

页面性能

GetCaps

页面裁剪

GetClipper

SetClipper

页面描述

ChangeUniquenessValue

GetPixelFormat


GetSurfaceDesc


GetUniquenessValue


SetSurfaceDesc

页面调色板

GetPalette

SetPalette

常用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.

相关文章
|
API 开发工具 C++
游戏编程之十五 DirectDraw 的基本知识
游戏编程之十五 DirectDraw 的基本知识
138 0
|
消息中间件 Ubuntu 编译器
Windows编程
Windows编程
50 0
|
存储 消息中间件 API
游戏编程之五 DirectSound
游戏编程之五 DirectSound
77 0
|
Windows
Windows程序设计——GDI基本画图的操作实现
Windows程序设计——GDI基本画图的操作实现
301 0