电脑游戏制作初探(也是从网上copy的,里面的知识很基础)

Windows平台的了解
程序员眼中的Windows

 程序员眼中的Windows和普通用户眼中的大不一样——不是快捷方便,而是相当麻烦和令人烦躁。尤其是在DOS下编过程的人都觉得Windows很别扭,有许多让人觉得古怪的概念。在Windows刚出台的时候,几乎把业余程序员全给淘汰了,因为编程变得相当复杂,比DOS要复杂很多倍。

 当程序复杂或多到一定程度时,再好的脑子也承受不了。我在一本Windows编程的书上看到一个外国作者这样写道:“通常程序员在写Windows程序时,都是将以往写的代码拿出来在上面进行改写,而不是重新编代码,因为那样太麻烦,谁也记不住那么多的东西。”的确,如果你用VC和调用Win32API来写一个标准的Windows程序,你就会觉得你喜欢VB。因为VB不写一行代码所生成的Form1窗体,在VC那里得写上百行的代码。

 不过我对Windows的印象就是一堆动态链接库提供的API(应用程序接口)。API成千上万,要想记住,没门儿!但是你要编写游戏也只能用它,谁让微软的Windows到处都是呢。

Windows程序的一些概念

 首先应该说的是事件驱动机制。以前在DOS上写程序,都是程序员自己写代码来接受用户的按键或鼠标信息,然后分析用户所按的键来决定自己的程序如何运行。现在这件事情Windows已经替我们做了,我们所要做的是等Windows发消息通知你的应用程序,告诉你用户对你的程序按什么钮了,或别的什么消息。作这样的处理是为了解决多任务所带来的麻烦。想象一下如果Windows同时运行100个程序,这些程序都拼命地判断用户按什么钮,这肯定会乱成一团的,而且还白白浪费CPU来运算同一个问题,所以这些事情由Windows统一处理了,它负责统一判断用户在按什么钮。比如Windows正在同时运行3个程序,用户点击了第一个程序,这时Windows就会把这个事件转换成消息告诉第一个程序,第一个程序就会知道用户正在使用它,而其它两个程序则不会知道这个事件,所以也不会有什么反应。这就是事件驱动机制,程序要做的只是等待用户的操作事件,然后作出相应的处理。

 其次要说的是消息,虽然用户的操作事件被Windows转换成了消息,但并不代表消息只是些操作事件。消息还有很多种,可以做很多事,它负责传递信息给程序。比如Windows要关闭系统时,它会给所有运行中的应用程序发一个它要关闭的消息,这样大家就会看见应用程序都被自动关闭了。大家知道Word软件在你关闭系统时,会显示提示你保存文档的对话框,其实这就是Windows要关闭时发给Word的消息,Word怕你正编辑的文档没存盘才提示你是否存盘的,而不是Word随时检查Windows到底什么时候要关闭。

 还有一个概念即回调函数,英文叫Callback,意思是别的程序调用你的函数,而不是你调用别的函数。但在DOS下编程的人可能没听说过这个概念,因为DOS系统不调用你写的函数。可能有人在某些Windows上看到过窗口处理函数、枚举函数,其实它们都是回调函数。回调函数用途很广,比如当Windows发消息时,就会调用你写的回调函数来发这条消息,实际上是调用你写的函数,然后将消息通过函数参数传递到函数里面。所以接窗口消息的函数也叫窗口处理函数,这只是回调函数的一个应用,上面提到的枚举函数就是用回调函数来做枚举工作。在DirectX中枚举(列举)显示模式就是用回调函数来做的。DirectX将系统中所有支持的显示模式都发到回调函数里,而不是你调用DirectX去检查系统支持的所有显示模式。

Windows程序是如何构建的

 由于大部分的程序都需用窗口当界面,所以应用程序一般都和窗口结合得很密切。如何编写一个只有窗口而没有任何功能的应用程序,是学写Windows程序的入门,它是一个标准的Windows程序,通过了解它你就会知道Windows是如何工作的了。

 首先应该通过Win32API中的服务函数来建立一个窗口,然后写一个窗口处理函数来供系统调用,最后写一个消息循环来时刻取消息。这几个步骤中缺哪一个也不成,如果没建立窗口,那么消息循环和窗口处理函数就根本没用;如果没写窗口处理函数则窗口根本建不成;要是没写消息循环,那么Windows发给你的消息就会取不回来,屏幕上的窗口则会象死的一样,怎么点、拽都没反应,如果窗口处理函数接了消息不处理则也会出现类似现象。

如下图所示:

 这就是大概的结构,应用程序就是这样时时刻刻地在取消息,取完后再把消息发给窗口处理函数去处理。确切地说,Windows实际上并不是将消息直接发往应用程序的回调函数,而是将消息放进这个应用程序的消息队列中,然后等待消息循环来取。这个消息队列是随着窗口的建立而建立的,它可以储存一部分消息,也可以防止消息的丢失。当消息被取回来时,取消息的函数就会调用窗口处理函数来处理它。

Windows的多任务

 Windows平台的一个显著特性是多任务,也就是说它可以同时运行多个程序。这个特性给我们带来了极大的方便,我们可以一边写文章一边听音乐,还可以同时在打印机上输出文章。

 多任务可以让每一个程序都误认为它自己独占了机器,因为Windows并不象以前的DOS那样,执行一个程序时就把机器的控制权交给这个程序,而是将CPU轮流交给它运行的程序,这样每一个程序就都可以执行了。实际上Windows只给每个程序分配很少的时间来使用CPU,所以这些程序看起来就象在同时运行一样。这就是多任务的原理,不过当Windows处理的东西太多时,它就会变得很慢。

 早期的Windows用的是一种叫“非抢占式的多任务”,这种多任务的执行原理是Windows的系统时钟周期性地中断一个任务并执行下一个,也就是说它给每一个程序的时间都是一样的。现在,Windows使用的是“抢占式的多任务”,这种多任务和早期不同是,Windows会将它所运行的程序按优先级运行,一个程序的优先级越高,Windows给它分配的运行时间就越长。通常Windows会将用户正在使用的程序置成高的优先级,所以用户觉得他运行的程序都是快的,就是同时运行的程序多了也没有太大的影响。而“非抢占式的多任务”在程序越多的时候则越显得慢,因为它把很多时间都分配给了用户没用到的程序。

图形硬件的了解
视频子系统的结构

 视频系统的好坏直接影响到电脑的性能,很多人甚至以为他看到的画面就是电脑上的全部东西了,更有人以为电脑就是那台显示器。这虽然很荒唐,但也反映出视觉图像在人们心目中的地位。

 通常视频子系统是可以更换的,因为它们绝大多数就是我们所说的显卡,也有集成到主板上的。它主要包括显示协处理器和显示内存(显存),显示协处理器和CPU用扩展总线相连。视频子系统上的显示协处理器也有自己的一套总线,通过这套总线它可以快速访问上面的显存,就象CPU访问系统内存一样。它自己也是个独立的系统,所以叫它们为视频子系统。由于硬件设计的原因,CPU可以通过总线访问到视频子系统上的显存,但显示协处理器却访问不到主板上的系统内存。然而总线的速度也远远不能满足需要,当CPU和显示协处理器进行大量数据吞吐时,总线就变得异常拥挤。为了解决这个问题就产生了AGP结构,这种结构把显示系统直接和系统内存连接在了一起,也就是说它绕过了系统总线,这样既缓解了总线的压力又解决了CPU和显示协处理器的数据互访问题,而且用AGP传输数据的速度要比总线快得多。

显示图像的原理

 首先要说的是显示器,它和家里的电视机原理相似,只不过是指标和结构有些不同罢了。它里面主要有显像管、电子枪、偏转线圈和控制电路等几大部分,它根据电脑传过来的图像来进行图像扫描。而为了显示彩色图像,电子枪都做成了3个,就是红枪、绿枪、蓝枪,它们发射的电子分别对应着屏幕上的各个红绿蓝发光点,当电子撞击到屏幕上的发光点时我们就可以看见这个点亮了。当显示图像时电子枪就飞快地扫射电子来显示相应的图像,这时偏转线圈就开始发挥它的作用了。提到线圈,大家总会想到电磁,没错,电子就是在偏转线圈的磁场作用下才偏移到屏幕的各个位置上的。如果显示器的偏转线圈坏了,我们就会看到屏幕中间有一个非常亮的点,那是什么呢?是所有图像都被电子枪打到了一块,由于电子已经不能偏转了,所以电子枪就把电子都射到了屏幕的中心,就成了这个样子。

 在3个电子枪上都有256阶电压,所以3枪组合可以显示出16777216种颜色来,也就是我们所说的真彩色。

图像的数据表示

 图像的数据表示是指如何用数据将图像表示出来,详细知道这一细节就可以对图像进行各种修改以产生各种图像效果,比如渐变什么的就都可以自己手工写了。

 最简单的就是真彩色的图像了,它由24位二进制表示,其中RGB(红绿蓝)各占8位,也就是一个字节,对于编程语言中尤其不擅长位运算的语言来讲是很好处理的,可以用专用的字节型变量对它进行直接修改。而16位的RGB就麻烦了,它通常是565或555格式的,565就是用5位二进制表示红、6位二进制表示绿、5位二进制表示蓝。555(也称5551格式)和565的意思是一样的,只不过它是用5位来表示绿。这样的话就得进行二进制运算才能把里面的RGB分别提取出来,因为RGB不是完整的字节,所以运算起来注定要麻烦一些。但是在软件开发方面通常用的是16位色,对于电脑来讲它要比24位和32位的图像显示快,同样大小的图像,16位色占用的空间要比24和32位的小一些,虽然16位的图像渲染比较麻烦一点,但为了速度大部分开发人员还是选择了它。

 32位色对于广大用户来讲是个盲区,很多人迷信它比24位色显示的颜色要多,所以他们通常的做法是把自己的Windows设置成32位色,其实这样又慢又没什么用。32位色只不过比24位色多出来8位而已,前24位和24位色是一样的,而剩下的8位根本没用来显示,而是用作标志位或其它的用处。通常3D运算时能用到32位色,而2D作图或玩2D游戏的时候就用不上了,因为它太慢。

调色板

 单独讲调色板格式的图像,是因为它和上面的显示原理很不一样。调色板图像的显示用的是8位RGB,与上面不同的是它用8位来表示调色板的颜色索引而不是真正的颜色。因为真正的颜色都在调色板中,所以调色板图像不会出现16位色中的位运算来提取RGB色,但它却常常令开发人员感到迷惑,因为使用调色板弄不好会把颜色搞得很乱。不过在我们玩过的老游戏机和老游戏中它却立下了汗马功劳,因为在当时硬件价格昂贵的情况下,调色板是最节省显存和内存的一种显示方式。所以当时的MD、FC等游戏机的图像都是颜色不佳,不过随着技术的发展,调色板已经基本上被开发者放弃了。
调色板的使用要视开发的软件而定,如果你要开发一种颜色不是很多,速度却很快的软件,调色板方式应该是你最佳的选择,因为它比其它的显示方式要快得多,比如格斗游戏、动作游戏都可以用调色板来显示。

下面是调色板示意图:

 显存中的数据就是要显示的图像,但图像中真正的颜色值却是从调色板中读出来的,而实际上显存中储存的是调色板中的颜色索引,所以一个调色板图像如果没有调色板将无法显示。也可以给同一幅图像更换其它调色板,如下图:

 左边是正常的调色板图像,而右边是更改过的调色板图像,这种技术可以给游戏中的角色更换衣服的颜色,也就是我们在格斗游戏中常见的用不同色区分同一人物的方法。

撕裂现象

 大家都应该见过撕裂现象,只要稍微留点神就可以见到某些软件会产生这种现象。撕裂现象其实就是玩游戏或看视频时的图像上下错位情况。如图所示这个咪咪的胡子就是在高速播放时产生的撕裂现象。撕裂现象是游戏开发者经常遇到的问题,不过不难解决,下面我来介绍一下它是怎样产生的。

 就感官而言,我们看到的显示器上的图像其实是显示内存中的一个数据区,这个数据区的大小视显示模式而定,在DirectX中则叫做主图面。当运行游戏时,游戏需要将后台显示页合成的图像写入主图面,这样我们就可以在显示器上看见游戏的图像了。也不全是直接写入主图面,但我们要想看见连续的高频动画就得不停地刷新主图面。而问题就出在刷新上,其实显示器显示图像也是有一个过程的,但是实在是太快了。一般的显示频率都在60Hz到85Hz之间,就这样它也是显示器用电子枪一行一行地扫下来的。而撕裂现象就是出在主图面的刷新和显示器刷新之间,因为它们的刷新不同步才产生了这种现象。如下图所示,显示器正在扫描主图面中的小球。

 A步骤是显示器正在扫描主图面,但正扫描显示到大概1/3的部分。正在这时主图面被刷新成小球往右移动的数据,这就产生了B步骤中的现象。在这时显示器上1/3已经是原来的A步骤中的图像,但却要继续读取主图面中剩下的2/3的数据,但这2/3的数据却和A步骤中要画的图像不同,所以撕裂现象就产生了。

 要解决这个问题也不难,只要知道显示器的电子枪什么时候关闭并从左上角开始重新扫描即可,专业点说是等垂直空白(Wait for vertical blank),这样就可以防止撕裂现象并达到同步显示的效果。

你可能感兴趣的:(游戏,编程,windows,api,dos,任务)