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对象
的页面,不需要使用调色板.通过调用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来恢复,这样它们的内容将在显示之前被重新装载.
字节,用来描述像素的真实颜色.
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 |
|
换页 |
|
|
页面性能 |
|
|
页面裁剪 |
|
|
页面描述 |
|
|
页面调色板 |
|
常用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.
DirectDraw读书笔记的更多相关文章
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
- LOMA280保险原理读书笔记
LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...
- 《3D Math Primer for Graphics and Game Development》读书笔记2
<3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...
- 《3D Math Primer for Graphics and Game Development》读书笔记1
<3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...
随机推荐
- Eclipse启动报错[ out of memory error has occurred ]或[ An internal error occurred while showing an internal error ]
自我总结,有什么需要纠正或更好的方案,请告知,谢谢! 最近上来看到好多同学都遇到了这个问题,之前我也好几次碰到这个问题,很是恼火,什么没干,eclipse一开电脑就卡死了,后来发现不管是新打开ecli ...
- Linux面试题(2)
一.Linux操作系统知识 1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块? Centos,Ubunto,fedora,openSUSE,Debian等,擅 ...
- 《.NET 设计规范》第 4 章:类型设计规范
第 4 章:类型设计规范 4.1 类型和命名空间 要用命名空间把类型组织成一个由相关的功能区所构成的层次结构中. 避免非常深的命名空间层次.因为用户需要经常回找,所以这样的层次浏览起来很困难. 避免有 ...
- 高通ASOC中的machine驱动
ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...
- Jmeter之http性能测试实战 NON-GUI模式 进行分布式压力测试——干货(十二)
Apache JMeter Distributed Testing Step-by-step This short tutorial explains how to use multiple syst ...
- 21_python集合总结
集合 1.无序的:没有索引,不能改和删出某个元素,不能返回某个索引元素2.不可重复 : 可以利用set去重3.数学运算:交集.并集.差集,反交集,超集/子集4.里面的元素:必须是可哈希的,不可变的.他 ...
- python中的time模块
time模块--时间获取和转换 time模块提供各种时间相关的功能 与时间相关的模块有:time,datetime,calendar 必要说明: 这个模块的功能不是适用于所有的平台 这个模块中定义的大 ...
- 关于document.body.scrollTop与documentElement.scrollTop
遇到document.body.scrollTop值为0的问题 今天在写一个小demo的时候,使用滚动条,我用document.body.scrollTop获取滚动条的位置,但是很奇怪的发现在谷歌上获 ...
- 试着把.net的GC讲清楚(1)
什么是GC? GC(garbage collection)是对内存管理中回收已经不用的内存的一种机制,我们熟知的java和.net都有自己的GC机制,是内存管理的一部分. 为什么会有GC呢?是因为动态 ...
- [APIO2015]雅加达的摩天楼
Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 " ...