游戏开发基础(4)[2]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 zhucde 的 blog

  setdisplaymode()函数用于激活所支持的显示模式。setdisplaymode()函数的directdraw2版本还允许设定显示模式的刷新率。而directdraw接口版本的setdisplaymode()函数只能进行显示模式宽度、高度和像素深度的设置。任何一个要进行显示模式切换的程序都要用到setdisplaymode()函数。
restoredisplaymode()函数用于存储调用setdisplaymode()函数之前的显示模式。setdisplaymode()和restoredisplaymode()函数都要求优先使用setcooperativelevel()函数得到的专有合作存取。
5. 表面支持函数
除了createsurface()函数之外,directdraw接口还提供了以下向个表面相关函数:
●duplicatesurface()
●enumsurfaces()
●fliptogdisurface()
●getgdisurface()
●getavailablevidmem()
●compact()
duplicatesurface()函数用于考贝当前表面。该函数只复制表面接口,不复制内存。被复制的表面与源表面共享内存,因此改变内存的内容就同时改变了两个表面的图像。
enumsurfaces()函数可用于迭代所有满足指定标准的表面。如果没有指定标准,那么所有当前表面都被枚举。
fliptogdisurface()函数的作用是在终止页面翻转应用程序前确保主表面得以正确存储。取消页面翻转时,有两个表面交替显示。这就是说,在终止应用程序之前有可能没有保存最初的可见表面。这种情况下,windows通过绘制一个不可见表面来恢复。利用fliptogdisurface()函数就可以轻而易举地避免发生这种情况。
getgdisurface()函数可以向只被gdi认可的表面返回一个提针。gdi表面是windows用于输出的表面。在进行屏幕捕捉时,这个函数非常有用,directdraw可以捕捉到windows桌面的任一部分。
getavailablevidmem()函数用于检索正在使用中的视频存储器(显示ram)的数量。这一函数由directdraw2接口提供,而不是由directdraw接口提供。该函数用于确定应用程序利用显示ram可创建表面的数量。
compact()函数不是通过directx5实现的,但它可以为视频存储器提供碎片整理技巧。在基于显示ram的表面被不断创建或受到破坏的时候,可以释放大量内存。
6. 监视器刷新函数
directdraw接口提供了4种适于计算机显示设备或监视器的函数,但这些函数不适于显示卡,它们是:
●getmonitorfrequency()
●getscanline()
●getverticalblankstatus()
●waitforverticalblank()
这些函数尤其与监视器的刷新机制紧密机连。这在确保生成动画时尽可能不产生闪烁和图像撕裂现象时是至关重要的。但必须注意,并非所有的显示卡/监视器组合都支持这些函数。
getmonitorfrequency()函数用于检索监视器当前的刷新率。刷新率通常用赫兹表示,缩写为hz。例如,60hz的刷新率表示屏幕每秒更新60次。
getscanline()函数用于向监视器返回当前正在被刷新的扫描行(水平像素行)。不是所有的显示设备/监视器组合都支持该函数。如果这一功能得不到支持,该函数将返回dderr-unsupported。
对于高性能图形应用程序来说,通常要求利用垂直刷新同步地更新屏幕。尤其是,当显示器刚完成屏幕刷新时,最好能够更新主表面。否则,屏幕的一部分显示新的图像数据,而另一部分仍显示旧的图像数据,这种现象就是所谓的图像撕裂。directdraw默认利用垂直刷新同步更新屏幕。如果不是这样还可以利用getverticalblankstatus()和waitforverticalblank()函数实现同步刷新。
7. getfourcccodes()函数
directdraw接口提供的最后一个函数是getfourcccodes()函数。该函数用于返回显示卡所支持的fourcc代码。fourcc代码用于描述非rgb或yuv表面。我们不在此讨论yov表面,它们已超出本书的范围。
第五节 directdrawsurface接口函数
同directdraw接口一样,directdrawsurface接口也遵守com规格.最初,表面支持是由directdrawsurface接口提供的。directx2介绍了directdrawsurface2接口的新的函数性,directx5介绍了directdrawsurface3接口。
尽管本软件中讨论的是directdraw2接口,而不是directdraw接口,但我们仍忠于最初的directdrawsurface接口,因为directdrawsurface2和directdrawsurface3接口新增的函数并不十分重要。在以后的内容里,我们将用directdrawsurface接口表示这3种接口,除非特别注明。
directdrawsurface是最大的directdraw接口,它允许表面内容的拷贝、清除以及被调用程序直接存取。directdrawsurawsurface接口总共提供36个成员函数,按字母顺序排列如下:
●addattachedsurface()
●addoverlaydirtyrect()
●blt()
●bltbatch()
●bltfast()
●deleteattachedsurface()
●enumattachedsurfaces()
●enumoverlayzorders()
●flip()
●getattachedsurface()
●getbltstatus()
●getcaps()
●getclipper()
●getcolorkey()
●getdc()
●getddinterface()
●getflipstatus()
●getoverlayposition()
●getpalette()
●getpixelformat()
●getsurfacedesc()
●islost()
●lock()
●pagelock()
●pageunlock()
●releasedc()
●restore()
●setclipper()
●setcolorkey()
●setoverlayposition()
●setpalette()
●setsurfacedesc()
●unlock()
●updateoverlay()
●updateoverlaydisplay()
●updateoverlayzorder()
1. 表面描述函数
我们首先讨论的个可用于检索表面自身信息的函数,它们是:
●getcaps()
●getpixelformat()
●getsurfacedesc()
●setsurfacedesc()
同directdraw接口提供的getcaps()函数一样,directdrawsurface接口提供的getcaps()函数用于输出表征哪些特征可被表面支持的数据。该信息包括:表面是主表面还是离屏表面;表面使用的存储器定位于显示ram还是系统ram。
getpixelformat()函数在用于高彩和真彩表面时是非常重要的,这是由于像素格式因显示卡的不同而不同。该函数返回表征码,这些表征码表明每一种颜色部件是如何存储的。
getsurfacedesc()函数返回一个表面描述。该信息包括表面的宽度、高度和深度。表面像素格式(同样被getpixelformat()函数检索)也包含在其中。
setsurfacedesc()函数(对于directx5)来讲是新增的,只由directdrawsurface3接口提供)允许设定某些表面属性。该函数可用于指定表面使用的内存。这一点在设计定制表面存储器管理器策略时非常有用。
2。 表面blt函数
directdrawsurface接口提供3个支持blt操作的函数:
●blt()
●bltbatch()
●bltfast()
blt()函数是一个主要函数。blt()函数能够进行常规的blting(无特殊影响的简单的表面到表面的blt),同时支持延伸、旋转、镜像和颜色填充的操作。当用于同剪裁器关联的表面时,blt()可进行剪裁blt操作。
bltbatch()函数不是在directx3下实现的(你可以调用该函数,但什么也不会发生)。执行bltbatch()函数时,如果可能,它可同时进行多blt操作。
bltfast()函数是blt()函数的优化版本。bltfast()函数的效率提高了,但性能却下降了。bltfast()函数不能进行一些特殊的blt操作,而blt()函数可以。而且,bltfast()函数不能用于剪裁。但是bltfast()函数支持源和目标色彩键码blt的操作。在遵循定制剪裁例程的情况下,bltfast()函数可进行directdraw能够提供的最快捷、灵活的blt操作。在下章中我们将执行一个定制剪裁例程。
以上3个blt函数均将源表面和目标表面作为变量。其他的数据,例如blt在目标表面上的理想定位,是通过指定理想blt操作的确切属性来提供的。一旦可能,这3个函数将进行硬件加速blt。
3. flip()函数
flip()函数用于页面翻转操作。调用flip()函数可隐藏屏幕上先前可见的表面,并使一个后备缓冲区显现。只有被明确地创建为翻转表面的表面,才响应该函数的调用。
必须牢记,真正的翻转操作不可能总是成功。页面翻转要求有足够的显示ram容纳两整屏有效数据。如果满足不了这一要求,系统ram中将创建一个后备缓冲区。这时调用flip()函数进行的是blt操作而不是页面翻转。基于系统ram的后备缓冲区中的内容被拷贝到主表面上。这样会严重影响性能,但是,在真正的页面翻转中如果没有足够的显示ram,又不退出程序,也只能如此了。如果你的应用程序要求最佳性能,就得设法避免激活不能进行真正页面翻转的显示模式。
4. 表面状态函数
下面讨论两个能检索有关操作和翻转操作信息的函数,它们是:
●getbltstatus()
●getflipstatus()
getbltstatus()函数用于确定当前是否进行blt操作。这一点很重要,因为正被blt的表面不能进行其他操作。该函数表明,给定的表面是否正是一个进行blt操作的源表面或目标表面。
同样地,getbltstatus()函数表明是否正在进行翻转操作。即使directdraw通过blt操作仿真页面翻转,该函数而不getbltstatus()也必须用于由flip()函数初始化的监视器页面翻转。
5. 色彩键码函数
directdrawsurface接口提供了以下两个函数,来设置和检查表面色彩键码或色彩键码的范围,它们是:
●getcolorkey()
●setcolokey()

本文关键:游戏
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top