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的主要核心内容.相关信息被组织为如下几组:

控制级(Cooperative
Levels)

显示模式(Display
Modes)

DirectDraw对象(The
DirectDraw Object)

页面(Sufaces)

调色板(Palettes)

裁剪器(Clippers)

1.控制级描述了DirectDraw是怎样与显示设备相互作用的,它如何对系统事件产生反应.使用IDirectDraw4::SetCooperativeLevel函数可以设置DirectDraw的控制级.最主要的是,你使用DirectDraw控制级来决定你的应用程序是运行于全屏模式(具有独占的访问视频内存的特性),还是运行于窗口模式.任何存在的页面都应该通过调用IDirectDrawSurface4::RestoreIDirectDraw4::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的各种对象,并且与系统层变量一起工作。以下是一些该接口的常用函数参考。

控制级

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.

DirectDraw读书笔记的更多相关文章

  1. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  2. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  3. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  4. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  5. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  6. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

  7. LOMA280保险原理读书笔记

    LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...

  8. 《3D Math Primer for Graphics and Game Development》读书笔记2

    <3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...

  9. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

随机推荐

  1. Unity Android 5.6版本Resources.Load效率的问题

    0x00 前言 相信不少使用Unity的小伙伴都听说过,甚至也亲身经历过在Unity5.6最初的几个版本中使用Resources.Load方法加载资源变--慢的问题. 这个问题的确是存在的,比如这个i ...

  2. bzoj 2208 [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N ...

  3. 接口中定义变量必须为public static final的原因

    在interface里面的变量默认都是public static final 的,原因如下: 1.   接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是 ...

  4. 如何将top命令输出重定向为文件

    命令: # top -b -n 2 -d 3 > /tmp/top.out 解析: -b: batch 模式,可以重定向到文件中 -n:一共取2次top数据 -d:每次top数据间隔为3秒

  5. 吴恩达深度学习笔记(deeplearning.ai)之卷积神经网络(二)

    经典网络 LeNet-5 AlexNet VGG Ng介绍了上述三个在计算机视觉中的经典网络.网络深度逐渐增加,训练的参数数量也骤增.AlexNet大约6000万参数,VGG大约上亿参数. 从中我们可 ...

  6. JDK,JRE,JVM的区别与联系

    JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...

  7. qt程序启动画面

  8. Javascript Sting(字符串)对象

    一, 如何计算字符串的长度? 可以通过.length属性来计算 <script type="text/javascript"> var txt="Hello ...

  9. ftp服务器的简单配置使用

    yum install -y vsftpd systemctl start vsftpd   cd /var/ftp/pub/   mkdir 111   touch weifeng.txt     ...

  10. Java面试题库及答案解析

    1.面向对象编程(OOP)有哪些优点? 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码的可理解性. 2.面向对象编程有哪些特性? 封装.继承.多态.抽象 封装 封装 ...