Windows Game Note2

来源:互联网 发布:python 重定向 编辑:程序博客网 时间:2024/05/16 18:20
1、总共只有五个组成了DirectDraw
① IUnknown:所有COM对象都必须从这个基本接口生成。
②IDirectDraw:这是开始使用DirectDraw时必须创建的主接口对象。IDirectDraw一对一地表示视频卡及其支持硬件。
③IDirectDrawSurface:这表示你用DirectDraw创建、控制和显示的实际显示表面。一个DirectDraw显示表面可以使用显存存于视频卡或者存在系统内存里。有两种显示表面:主显示表面(通常表示正在被视频卡光栅化和显示的实际视频缓冲区)和从显示表面(离屏缓存)。
④IDirectDrawPalette:DirectDraw提供对IDirectDrawPalette接口的支持以使用256或更少的颜色在视频模式下处理调色板。
⑤ IDirectDrawClipper:用于帮助剪切DirectDraw光栅和位图操作到一些可见显示表面的子集。
2、上述接口如何配合成为一个DirectDraw应用程序的:
①创建主Directdraw对象应使用QueryInterface()来得到一个IDirectDraw7接口,或是直接使用DirectDrawCreateEx()创建一个DirectDraw7接口。用这个接口来设置协作级别和视频模式。
②使用IDirectDrawSurface7接口至少创建一个主显示表面用以绘图。基于颜色深度和视频模式自身,如果视频模式是每像素8位或更少,将会需要一个调色板。
③ 用IDirectDrawPalette接口创建一个调色板,用RGB三元组初始化并配置到相关的显示表面中。
④如果DirectDraw应用程序要使用窗口,或者要减少位图以免溢出DirectDraw显示表面的可见边界,你至少需要创建一个裁剪器并将其尺寸设置为可见窗口的范围。
⑤ 主显示表面上绘图。
3、MS认可的检测DirectX函数错误的方法是使用这两个宏:
FAILED():检测是否失败
SUCCEEDED:检测是否成功
4、DirectDrawCreate()创建一个IDirectDraw接口而不是IDirectDraw7接口,可能返回的值DD_OK完全成功
用于请求IDirectDraw7接口的常量: IID_IDirectDraw7
通常,一个接口发出的调用采用以下格式:
interface_pointer->method(parms...);
而所有接口标示符则采用以下格式:
IID_IDirectCD, 其中C代表组件,D是一个从2到n的数字,指代你需要的接口。
5、DirectDrawCreateEx(),它与简单的DirectDrawCreate()函数相似,只是有更多额参数,并运行你创建任何的DirectDraw接口。任何时候,创建IDirectDraw7接口的调用都应该是这样的:
LPDIRECTDRAW7 lpdd;
DirectDrawCreateEx(NULL, (void **)&lpdd,IID_IDirectDraw7, NULL);
6、全屏模式:真个屏幕表面都分配给了你的游戏,并且是直接写进视频设备里,没有其他应用程序能接触到这种设备。
  窗口模式:在这种模式下,DirectDraw必须更多地与Windows协作,因为其他应用程序可能需要更新它们各自的窗口区域。
7、要设置DirectDraw的协作级别,需要调用IDirectDraw7的一个方法:IDirectDraw7::SetCooperativeLevel()函数。
8、创建一个256色的调色板并告诉DirectDraw你希望使用它,相关步骤如下:
① 创建一个或多个调色板数据结构:大小为256且类型为PALETTEENTRY
②从DirectDraw对象自身创建一个DirectDraw调色板接口IDirectDrawPalette的对象。一般来说这将直接映射到硬件VGA调色板寄存器。
③ 将调色板对象关联到一个绘图表面,如主显示表面,这样所有着色其上的数据能正确显示色彩。
④(此步可选)如果希望,你可以改变调色板项或者整个调色板。如果你在第二步中传递了一个NULL调色板并选择跳过第一步,你回需要执行这个步骤。
9、typedef structtagPALETTEENTRY {
   BYTE       peRed;
   BYTE       peGreen;
   BYTE       peBlue;
   BYTE       peFlags;
}PALETTEENTRY;  
你必须设置peFlags域为PC_NOCOLLAPSE,如果你不希望Win32/DirectX越俎代庖地优化你的调色板。
IDirectDraw7::CreatePalette()创建实际的IDirectDrawPalette接口。
10、主显示表面直接对应于被视频卡光栅化的实际显存,且任何时候都是可见的。因此,在任何DirectDraw程序里你都只能有一个主显示表面,它直接指向屏幕图像并常驻VRAM。
   从显示表面可以是任意大小,可以驻留在VRAM或是系统内存中,只要内存容量允许,可以创建任意多个从显示表面。从显示表面的第二个用途是保存你的位图图像和游戏中表示对象的动画,因为只有使用DirectDraw显示表面才能调用使用位于位图数据的硬件加速。
11、要创建任何显示表面,都必须执行这些步骤:
① 填充一个DDSURFACEDESC2数据结构,描述你所希望创建的显示表面。
② 调用IDirectDraw7::CreateSurface()来创建显示表面。
12、DDSURFACEDESC2数据结构中lPitch
它基本上就是你所在显示模式的水平内存间距。lPitch是该显示模式中每行上的字节数,也被称为步幅(stride)或内存宽度(memorywidth)。 视VRAM布局而定,lPitch可以是任何值,因此当你倾向于逐行访问一个DirectDraw显示表面内存时,你必须利用lPitch移到下一行,而不是用没像素字节数乘宽度,这点非常非常重要。
13、要关联一个调色板到任何显示表面,你需要做的仅是调用IDirectDrawSurface7::SetPalette()函数。
14、要访问任何显示表面,主显示表面、从显示表面等等,你必须对内存加锁和解锁,有两个原因使得这个加锁和解锁的序列是必须的:首先,要告诉DirectDraw你已经控制内存了,其次,要指示显示设备当你在操作锁住的内存时,它不能移动任何cache和虚拟内存缓冲区。
用来锁内存的函数叫做 IDirectDrawSurface7:Lock();
一旦你完成了所有由于当前动画帧对视频显示平面的访问,就需要对显示表面解锁,IDirectDrawSurface7::Unlock()方法完成解锁。
15、在你调用Release()以前,注意监测接口是否为非NULL,这一点是绝对必要的,因为接口指针有可能是NULL,而如果接口的实现者没有考虑这点,释放一个NULL指针可能引起问题。

原创粉丝点击