DirectDraw读书笔记
来源:互联网 发布:2017中国网络文化产业 编辑:程序博客网 时间:2024/06/11 10:04
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的主要核心内容.相关信息被组织为如下几组:
控制级(Cooperative Levels)
显示模式(Display Modes)
DirectDraw对象(The DirectDraw Object)
页面(Sufaces)
调色板(Palettes)
裁剪器(Clippers)
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的各种对象,并且与系统层变量一起工作。以下是一些该接口的常用函数参考。
控制级
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 aDDSCAPSstructure 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 theDDCAPSandDDSURFACEDESCstructures.
3. TheDDSURFACEDESCstructure contains a description of a surface. This structure is passed to the IDirectDraw::CreateSurfacemethod.
- DirectDraw读书笔记
- DirectDraw
- DirectDraw
- 《Windows图形编程》读书笔记——第3章 GDI/DirectDraw内部数据结构
- 高级DirectDraw
- 初试DirectDraw
- DirectDraw(转)
- Wince6 DirectDraw
- directDraw封装
- DirectDraw 示例
- 深入directdraw
- DirectDraw 示例
- 学习directdraw
- DirectDraw编程
- DirectDraw 示例
- DirectDraw YUV
- DirectDraw基础
- DirectDraw用法
- UVa 514 Rails (water ver.)
- DNN调试利器DNNDebug.aspx--如何调试出错信息不具体的程序错误
- 架构图收集
- 工作的方法、态度
- Qt项目编码详解
- DirectDraw读书笔记
- 从JAVA多线程理解到集群分布式和网络设计的浅析
- 云计算学习无忧:云平台技术架构与应用案例
- Oracle DataGuard物理备库的数据模式
- rman数据库迁移系列视频教程
- 请读完这篇文章后再谈恋爱吧
- 【一步步教你用U盘安装XP系统】
- 解决sdk更新的不了的问题
- 标准库string对象的定义和初始化