阅读917 返回首页    go 阿里云 go 技术社区[云栖]


DirectDraw读书笔记

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.最后更新:2017-04-03 14:54:11

  上一篇:go [Qt教程] 第32篇 网络(二)HTTP
  下一篇:go [Qt教程] 第31篇 网络(一)Qt网络编程简介