Gattaca

标题是记忆非常深刻的一部电影,《太空梦》,很好的励志片。自己一个人在电视上看的,那种感觉现在还记得。

第2章 - 调色板, 游戏概念, 双缓冲区等等(2)

注:原文地址:http://scorpioncity.com/dj2.html

3、一些你写程序时必须知道的概念

 

3.1 位图和子图形 

位图是一副图片在计算机里被当作一个像素值的数组来存储。这是个相当蹩脚的解释。基本上可以是计算机上的任何图片,通常是一块由像素组成的矩形。子图形是个和位图一样的东西,但是通常这个子图形相关的位图有透明区域(对于子图形的精确定义在程序员之间也是相当不同的)。子图形是游戏里一个相当重要的组成,有着超过一百万次的使用。例如,你的鼠标光标就是一个合格的子图形,DOOM里的怪物也是子图形。面向你的那边被编程为有透明区域的平面图片(有点绕)。记住子图形总是面对你,但并不是说怪兽总是面对你。不管怎样,对位图和子图形的解释应该足够了,我想。

3.2 双缓冲区和页翻转 

如果你的游戏直接绘图到当前显示器,当游戏直接绘图到屏幕时用户将注意到非常明显的闪烁。解决方案是准备两个图像缓冲区,一个“前缓冲区”,一个“后缓冲区”。前缓冲区是用户看到的那个,后缓冲区不是。你把所有的操作画到后缓冲区,当完成绘制完屏幕的所有部分后,你复制后缓冲区的所有内容到前缓冲区。这就是双缓冲区,事实上现在有好几种双缓冲区模式。
通常有两种方法来执行后缓冲区到前缓冲区的传输:复制或者页翻转。

复制:后缓冲区的内容简单的复制到前缓冲区。后缓冲区可以在系统内存或者其他显存表面(这个不会翻译了,应该是显卡内存吧);
页翻转:使用这种技巧,就不需要实际的复制操作。两个缓冲区都必须在显存中。为你游戏的每个框架轮流使用这两个表面来绘图。你总是绘图到当前不可见的那个缓冲区,在框架绘制完成后,你指示硬件去把这个绘制好的缓冲区当成可见的,因此在每个框架中前缓冲区现在都是后缓冲区了。

这个技巧会带来一个问题“Tearing”。显示器按照刷新频率重画屏幕上的图片,通常大约每秒70次(70Hz)。一般的,按照从上到下的顺序。这时问题出现了,当你使用上面的任何一种技巧指示硬件开始画另一个东西时,显示器只画了一半的图像。当你这么做时,下半截的屏幕使用的是新图像,而上半截屏幕还是老图像。这个效果就叫做“Tearing”,或者“切断”。有个已有的解决方案,无论如何,你的页面翻转有可能与屏幕刷新的结束很好的配合起来。(fixme:我想DirectDraw以及替你处理这个了,检查一下)。

4、 剪切和DirectDraw剪切器

 

剪切是一种技术,指预防绘图操作超出到屏幕外边或者超出一个矩形区域比如窗口。如果不执行这个,通常的结果用最好的词来描述就是一团糟(这句是瞎译的)。在DirectDraw里,例如,当使用窗口模式时,window会给DirectDraw一个它想要的正确的屏幕区域。无论如何,一个行为良好的DirectDraw程序应该只画属于自己的窗口。DriectX有一个对象叫做剪切器可以被加到DirectDraw表面来预防画到窗口外面。

5、DirectDraw表面

 

DirectDraw使用“表面”去访问一段内存,无论是系统内存还是显存,内存段通常用来存储位图,纹理图,子图形,屏幕或窗口的当前内容。
DirectDraw也支持“覆盖”,一个特殊类型的子图形,一个“覆盖”通常是屏幕上将被覆盖的包含透明位图的内存段。例如,一个赛车游戏可能对驾驶区域和窗口边框使用覆盖。
在有些情况下DirectDraw表面使用的内存可能被丢弃,因为DirectDraw和GDI共享资源。你的程序需要规律的检查看这个是否发生,如果被丢弃那就要恢复表面。

6、DirectX返回值和错误检查

 

所有的DirectX函数返回HRESULT作为错误码。自从DirectX对象基于COM体系后,正确的方法检查DirectX函数失败是使用宏 SUCCEEDED() 和 FAILED() ,用HRESULT做参数。并不是检查一个if就够了,例如,有的DirectDraw函数返回HRESULT等于DD_OK,但COM对象可能会有多种表示正确的返回值,你的代码有可能还会正确工作,但是这个是错误的方法。

有些事情需要引起注意,有写DirectX函数执行成功后会返回失败码。例如,当你仅询问数据大小的时候,IDirectPlay::GetPlayerData将返回DPERR_BUFFERTOOSMALL。This behaviour isn't documented either, which is incredibly frustrating. There aren't many of these, but be on the lookout.

7、DirectX调试


当你安装DirectX SDK是有个选择安装零售版库还是调试版的。调试版会诊断信息OutputDebugString到你的调试器,这个会很有用。无论如何,这个会降低很多速度。如果你只是想玩游戏,那就选择零售版的库,如果你主要做游戏开发,而且你有足够快的机器,安装调试版本。

 

posted on 2007-05-21 11:33 Gattaca 阅读(689) 评论(0)  编辑 收藏 引用 所属分类: DirectX


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理