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 ...
随机推荐
- Python实现XML文件解析
1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...
- docker挂载NVIDIA显卡运行pytorch
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 写在前面: 请参考之前的文章安装好CentOS.NVIDIA相关驱动及软件.docker及 ...
- @Controller注解
Spring从2.5版本后开始引入注解,用户可以使用@Controller,@RequestMapping,@RequestParam,@ModelAttribute等类似这样的注解. @Contro ...
- GO开发[六]:golang反射(reflect)
反射 反射:可以在运行时动态获取变量的相关信息 Import ("reflect") reflect.TypeOf,获取变量的类型,返回reflect.Type类型 refle ...
- 精通libGDX游戏开发-RPG实战-开发游戏的基本前提
说起RPG,大概国人是不会陌生的. 这不得不从中国单机游戏市场说起,由于早期软件市场被盗版杀死,顺带的,单机游戏软件作为软件市场的分支,也没赚什么钱,养不活公司纷纷倒闭,只到RPG游戏<仙剑奇侠 ...
- 第一个 HTML5Plus 移动应用
什么是 HTML5Plus 移动应用 HTML5 Plus移动App,简称5+App,是一种基于HTML.JS.CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生 ...
- hive权威指南<一>
一.ETL介绍: 数据抽取:把不同的数据源数据抓取过来,存到某个地方 数据清洗:过滤那些不符合要求的数据或者修正数据之后再进行抽取 不完整的数据:比如数据里一些应该有的信息缺失,需要补全后再写入数据仓 ...
- Exchanger
Exchanger可以在两个线程之间交换数据,只能是2个线程,不支持更多的线程之间互换数据. 当线程A调用Exchange对象的exchange()方法后,他会进入阻塞状态,直到线程B也调用了exch ...
- BZOJ 4765: 普通计算姬 [分块 树状数组 DFS序]
传送门 题意: 一棵树,支持单点修改和询问以$[l,r]$为根的子树的权值和的和 只有我这种不会分块的沙茶不会做这道题吗? 说一点总结: 子树和当然上$dfs$序了,询问原序列一段区间所有子树和,对原 ...
- transform复习之图片的旋转木马效果
效果示意图 <!DOCTYPE><html><head><meta http-equiv="Content-Type" content=& ...