目录 Bk*AO?3p
Az{Z=:(0
1 游戏程序理论 d A[I
1.1 技术基础 V!(Ty%7
1.2 游戏底层 K#kU6/
1.3 编写规则 b+9M? k"
1.4 程序设计 ;i@,TU
1.5 制作流程 +\2{{~_z
1.6 程序调式 N\BB8<F
1.7 代码优化 ?V3e;n
]^$3S
3a_~18W
1 游戏程序理论 jIaAx_
我做游戏的历史只有三年,我所写的内容都只是我在此期间的感觉和经验,还远远谈不上完整和正确,甚至有些内容我们自己也没有完全达到,我只是试图说明我们曾经是怎样做的和在最近的将来打算怎样做。 Z~CL|=
我读过一些关于如何制作游戏的文章和书籍,有外国的,也有国内的。有的过于难懂(那些专业技术有的我根本看不懂),有的过于简单,而且大都着重于程序编写技术。我在这里希望能够提供其它方面的帮助,比如游戏中的程序设计,项目管理和与我们中国人编写游戏相关联的一些问题。 s,)Z8H
我希望能够给那些想编写商业游戏和正在编写商业游戏的人们提供一个样本,这不是最好的样本,而是在中国内地游戏制作业的初级阶段中一个普通产品的制作方法和经验。如果是一个初学者,我希望给他一个编写游戏程序的完整印象,让他至少了解编游戏和玩游戏是有区别的。 9s7sn*aB#5
我希望阅读本文的人应该是一个程序员,熟练使用C语言和C++语言,曾经编写的单个程序长度应该在5000行(150k)以上。因为我在这里不会介绍任何有关编程语言的语法,编译等内容,如果你连这些内容都还没有弄清楚,请先学习一下,否则将很难与本文引起共鸣。假如你是一位美术设计,游戏策划人员或游戏项目管理人员,虽然你无法看懂里面的大部分内容,但是我也希望你能够了解里面的有关内容,因为如果你能够了解程序员的工作,我们就能够更好地配合。 M<4~ewWJ
我更希望那些不了解游戏的人们能够看到本文,我希望他们能够了解编写游戏程序与编写其它程序是一样艰巨和复杂的,制作游戏并不等同于玩游戏。 7X*$Fu<
tU.Y$%4
1.1 技术基础 sFuB[
JJ}
V'K1kYb
1.1.1 人员 IZoS2^:yw
作一个商业游戏所需要的程序员的水平,可以分成三个级别:系统分析员、主模块程序员和外围程序员。 N^jQ\|A<
·系统分析员: q ^Un,h64t
这里的系统分析员也许比不上程序员资格考试中的系统分析员,因为我们制作的游戏程序到目前为止都属于中小型程序,长度一般在50000到200000行之间(1.5M到6M),经过压缩之后源代码可以轻松放在一张软盘上。工作量一般在20到60人月之间。所以游戏程序的复杂程度比一些大型应用程序要小。但是,游戏系统分析员的工作也一样是复杂繁重的。他的主要工作是需求分析,程序设计和进度管理。 #41~`vq3
在需求分析阶段,主要是根据游戏设计制定的游戏方案确定那些内容是可以实现的,那些是不能实现的;可以实现的部分如何实现,不能实现的部分该如何修改。最后制定一个可行的游戏程序制作方案。这个方案最后被系统分析员写在程序设计文档中。当设计定稿后,制定开发计划,组织人力开发,监督制作成果。 S=@.<gS
·主模块程序员: y yW;VKN
过去我们的系统分析员和主模块程序员由同一人担任,但是到后来,我们发现,因为程序的管理设计人员也要担任繁重的程序制作任务,很难面面俱到。所以我建议把主模块程序员独立出来。由他来负责对游戏主要运行部分进行编程。这需要主模块程序员具有非常丰富的编程经验,至少应该具有完成一个游戏的经验。但是其实每个人都是从不会到会,从没有经验到经验丰富的,不能满足条件也没有关系,只要程序难度小一些就可以了。 9(V12gn+lk
}4b
4<Sm_h
·外围程序员: Mj|\LF +
游戏的程序一般都会被分割程序若干个模块,如果该模块独立性比较大就可以交给其他人员完成。这些人只要有一定编程经验就可以胜任了。 Lk9X>`b#B
hRHqG
1.1.2 编程平台 e3oHe1"hP
任何的计算机语言都可以被用来写游戏。游戏可以被运行在任何可能的计算机硬件设备上。但是,因为我的制作经验的局限,我无法向你们介绍用Cobal语言编写AppleII上运行的游戏。同样,我也不会教各位如何使用Visual Basic,Pascal或Java,任何形式的DOS程序也是我不会花时间讲解的。在我后面的讨论中将只涉及在windows95/98下的Visual C++编程。 Bf1,(^3XH
现在,编写游戏时不能不提到Microsoft公司的DirectX。它是一套基于Windows95/NT的游戏底层接口,在我们的游戏中使用了它作为底层接口。关于它的使用想必大家已经很熟悉了,现在已经有中文的书籍出版,我不必赘述。 %\IB_M
有的书上讲在编译和调试程序时最好使用Windows NT或双显示器,尤其因为DirectDraw中独占显示器。可是我试过之后发现都不实用。对于WindowsNT,它的4.0版只支持DirectX 3.0, 听说5.0版才支持DirectX 6.0,但我总不能等到NT5.0出了之后才开始编吧。对于双显示器,我一直耿耿于怀,外国人都很阔,每个人可以配备两台机器,可是,就算我找到两台计算机,程序装入的速度实在让我不耐烦,调试一遍时间太长,等不起。 4}E|CD/pZ
我们应该重视的倒应该是计算机的兼容性问题。为我们提供测试的计算机是很少的,如何找到更多的条件才测试我们的程序是后期应该注意的问题,千万不要以为在Windows95时代计算机硬件的差别已经没有了,它们出起错来更危险。 2+m%f"
F<39eDNpz
1.1.3 语言 -|YG**i/
在任何一本写游戏编程的外文书籍里都会提到编程语言主要有两种,汇编和C。有的书里甚至不提倡使用C++。不使用C++的原因我猜有两个:第一,速度。据说C++代码比C代码慢10%。这个数字我没有测试过,但C++比C慢大概应该是对的。因为用C++比直接用C编写代码要方便和简单,所以速度应该会慢。第二,便于移植,移植这个词可很时髦,什么PC到PS啦,PS到Saturn啦,Saturn到N64啦,N64到Mac啦,Mac到PC啦之类,一个游戏必须要在所有地方出现才过瘾。如果使用C++就难了,因为象次世代游戏机上的开发环境,一般不支持C++,N64虽然说是支持但仍然建议使用C。 )!z<q}i5
使用汇编的理由也是很简单的,那就是快!因为游戏编程中表现最明显的地方就是游戏的速度。汇编比C快的道理也是很明显的,那就是汇编要比C难写多了,速度自然快些。 n** W
dZK/v
那么速度就那么重要么?过去上学的时候,用汇编写出来的程序编译出来的一般十几k,后来用C写的小程序大的有几十k,而现在编译windows程序,一上来就有一百多k。过去的游戏就是绿色屏幕上几个字符,而现在都是真彩色的图象和实时三维。过去的游戏一个人就可以“搞定”,而现在必须分工合作。这些给我的感觉就是游戏越做越大,程序越写越长。是不是有一些方面开始变得与游戏速度一样甚至更加重要了呢? -fKo~\Pr
有!这其实就是大家经常谈论到的一个问题:程序的Bug。一个程序如果越来越复杂,越来越长,而且多个人共同编写,这时候就越容易出现程序中的臭虫。我认为,以我们目前的程序编写水平而言,程序的正确性要远远高于它的效率。实际上,我在后面的主要篇幅都在讲如何提高程序的正确性上,而只有很少的篇幅介绍程序的优化。 F9IrbLS9c
所以我选择编程语言主要是从其正确性和效率两个方面来考虑的。目前我选择C++。 MH7 n@.t
)7j jfD\
这不仅仅因为我对这个语言最熟悉,更因为它的特点,对两个方面都符合得很好。程序是人写出来的,如果程序越容易写,就越容易正确,这方面汇编语言显然不是候选者,Pascal虽然好,但是那些Begin和End写起来也太累。 C语言要省事得多,C++更进一步,而且有了封装,继承,多态的概念。可是编写最方便的首选应该是Visual Basic,Delphi和Java了。程序的框架都已经被准备好,只要在里面填东西就可以了。只是因为它们的效率比较低,而不能成为游戏编写的最佳语言。 #q#C_"
现在很难想象一个游戏整个都是用汇编写的,因为一个10000行的C程序改用汇编写至少需要50000行,那其中出错的机会至少要多出5倍,而且汇编代码太过抽象,很难读懂。所以应该只在非常需要效率的地方才需要使用汇编语言。 ROsR;C0!
C语言与C++的差别不大,而且我认为C++所带来的封装的概念足以弥补它们的速度差异。关于移植,有消息说Sega最新一代的游戏机DreamCast要使用Windows CE作为操作系统,那么C++应该也会支持的了。大融合的时代总会到来,不同担心。我的C语言代码也主要用于程序的底层。 H]As2$[
那么,现在大家对我所使用的语言应该有所了解了。使用C++作为主要语言,同时辅助以C和汇编。 8w/$!9[
W;!OxOWZJ
1.1.4 编译环境 wrI66R}@
Microsoft Visual C++2.0/4.0/5.0/6.0是我一直使用的编译器。虽然Borland C++和Watcom C++也可以编译Windows程序,我仍然认为Visual C++是最好的。没有别的理由,就是因为习惯了。如果你已经习惯使用Watcom C或Free C什么的,也没必要改。如果从来没有编过Windows程序,倒是可以先从这里开始。 uj;tmK>;
我听说谁如果不会使用SoftICE调试程序就没有达到编程的顶峰,我一直以此为遗憾。我不会使用SoftICE。我也远远没有达到编程的顶峰。“竟然这样的人也编起游戏来了”,也许有的人会这样想,我想这没关系,因为本来谁都可以编游戏的嘛。 cBZ$$$v\#
pY]T32
1.1.5 背景知识 Mtq\xF,/+
编程序到底需不需要是专业人才,这也是个大家争论的话题。我还是那个观点,这只是一个起点的问题,它只表明入门时候的速度而已。但这并不是说你什么都不需要学。有许多东西需要我们学,甚至需要我们不停地学。 1k"<T7K
·硬件知识: |qTvy,U[
你总不能连自己的计算机是什么CPU都不知道吧。虽然我们不需要知道每个芯片的内部构造,但如果我们知道了Pentium CPU有两条并行流水线同时处理指令的话,我们就会特别注意这方面的优化了。 A:!_ &