background image

看到在绘制屏幕时出现的各种讨厌的人为现象(象闪烁)。现在,图像已经准备好给用户看
(亦即渲染结束)。这时有两个基本的方法把图像从离屏表面上取出放在屏幕上。一是把内
容从离屏表面复制显存上。二是使用硬件页面翻转,这意味着你要命令图像硬件从显存中不
同的点开始刷新屏幕

——典型的是,你让它指向你的离屏表面。现在显存中的一个区域成为

你的离屏表面,当你画完后,页面翻转完成了。

这种技术的问题是可能产生

"图形撕裂"。由于显示器屏幕图像的刷新相当频繁,基本上

是每秒

70 次(70Hz)。假设按照通常的方法从上往下画,当屏幕上画到了一半时,你又决

定命令画别的东西(用上述两种方法中任一种),这时候就会 发生

"图形撕裂":屏幕下半

部分以新的图像绘制,这就是图形撕裂,或图形剪切。有一种解决方案,就是以屏幕刷新率
来定时控制页面翻转。

2.4.裁剪和 DirectDraw 裁剪器

裁剪是用来防止绘图程序画出屏幕或其它矩形边框区(如窗口的边缘)的一项技术。若

没有执行裁剪,通常会画得一团糟。在

DirectDraw 里,举例子说,在用窗口模式时,正常

DirectDraw 应用绘图只能画自己窗口,但 Windows 给了 DirectDraw 画屏幕任意处的权力。

为了避免画到窗口外,

DirectX 选用了一个附属于 DirectDraw 表面的对象

--“clipper(裁剪

器)

”来防止这一点。

2.5. DirectDraw 表面

DirectDraw 使用

“表面”访问显存或内存的任何区域,(通常)这用于存储位图、纹理图、

精灵、当前屏幕或窗口的内容。

DirectDraw 也提供用于"覆盖"的专用精灵类。覆盖是通常指一个包含有透明区位图的表

"覆盖"到一个场景上。例如,赛车游戏可能使用一个图像覆盖驾驶员控制舱和窗框。

由于

DirectDraw 必须与 GDI 共享资源,DirectDraw 表面使用的内存

/显存在一些情况下

可能被丢失。因此应用程序必须定期检查,防止这样的事发生。如果已经发生则还原之。

2.6. DirectX 返回值和错误检查

DirectX 函数返回 HRESULT 作为错误代码。由于 DirectX 对象基于 COM 体系结构,正

确的检查

DirectX  函数失败的方法是向使用带有 HRESULT 参数的宏 SUCCEEDED()和

FAILED() 。 它 不 仅 仅 检 查 这 些 ( 例 如 , 它 不 仅 仅 检 查 DirectDrawHRESULT 是 否 为
DD_OK,对 COM 对象来说,使用多重返回值作为成功值是可能的。

2.7. DirectX 调试

当你安装

 DirectX SDK 你将选择是否向安装发行版的函数库,或者调试版。调试版实际

上为

Visual C++的 TRACE 输出窗口写诊断的信息,这是非常有用的。如果你主要玩 DirectX

游戏,那么安装发行版。如果你主要想做

DirectX 开发,安装调试版。

3.第 :简单的 DirectDraw 示例

3.0.内容

3.1.在 Visual C/C++ 下设置 DirectX 
3.2. DirectDraw 示例
3.3.设置共用的变量;Globals.h 和 Globals.cpp 
3.4.初始化 DirectDraw 系统
3.5.设置屏幕模式
3.6.创建表面
3.7.创建裁剪