这是每个游戏编程FAQ里都有的问题。这个问题每星期都会在游戏开发论坛上被问上好几次。这是个很好的问题,但是,没人能给出简单的答案。在某些应用程序中,总有一些计算机语言优于其他语言。下面是几种用于编写游戏的主要编程语言的介绍及其优缺点
, D: k5 p/ y R& x# D. |5 x4 f1、C语言
8 H4 M% s/ \. G2 {如果说FORTRAN和COBOL是第一代高级编译语言,那么C语言就是它们的孙子辈。C语言是Dennis Ritchie在七十年代创建的,它功能更强大且与ALGOL保持更连续的继承性,而ALGOL则是COBOL和FORTRAN的结构化继承者。C语言被设计成一个比它的前辈更精巧、更简单的版本,它适于编写系统级的程序,比如操作系统。在此之前,操作系统是使用汇编语言编写的,而且不可移植。C语言是第一个使得系统级代码移植成为可能的编程语言。 + Z$ f# t2 w" _: j
C语言支持结构化编程,也就是说C的程序被编写成一些分离的函数呼叫(调用)的集合,这些呼叫是自上而下运行,而不像一个单独的集成块的代码使用GOTO语句控制流程。因此,C程序比起集成性的FORTRAN及COBOL的“空心粉式代码”代码要简单得多。事实上,C仍然具有GOTO语句,不过它的功能被限制了,仅当结构化方案非常复杂时才建议使用。 - j1 K/ W/ W) F1 L
正由于它的系统编程根源,将C和汇编语言进行结合是相当容易的。函数调用接口非常简单,而且汇编语言指令还能内嵌到C代码中,所以,不需要连接独立的汇编模块。
1 P$ N7 E- E& x) X1 T" k4 { u( T优点:有益于编写小而快的程序。很容易与汇编语言结合。具有很高的标准化,因此其他平台上的各版本非常相似。
$ k5 P1 L; w" i" x0 m! F3 Y缺点:不容易支持面向对象技术。语法有时会非常难以理解,并造成滥用。 % Z# e _' V' z) ^2 H3 w; m& Z
移植性:C语言的核心以及ANSI函数调用都具有移植性,但仅限于流程控制、内存管理和简单的文件处理。其他的东西都跟平台有关。比如说,为Windows和Mac开发可移植的程序,用户界面部分就需要用到与系统相关的函数调用。这一般意味着你必须写两次用户界面代码,不过还好有一些库可以减轻工作量。 & b7 X" ?6 P6 S7 P- }6 M+ S
用C语言编写的游戏:非常非常多。
! F3 a9 i5 T& D, v7 w. ~) D0 j+ V资料:C语言的经典著作是《The C Programming Language》,它经过多次修改,已经扩展到最初的三倍大,但它仍然是介绍C的优秀书本。一本极好的教程是《The WaiteGroup's C Primer Plus》。 1 E6 |- g7 B9 r3 B* g; M4 T/ Q
2、C++
$ C5 T6 v6 r' pC++语言是具有面向对象特性的C语言的继承者。面向对象编程,或称OOP是结构化编程的下一步。OO程序由对象组成,其中的对象是数据和函数离散集合。有许多可用的对象库存在,这使得编程简单得只需要将一些程序“建筑材料”堆在一起(至少理论上是这样)。比如说,有很多的GUI和数据库的库实现为对象的集合。
5 M6 D) m0 |* Y l! m* t! B, jC++总是辩论的主题,尤其是在游戏开发论坛里。有几项C++的功能,比如虚拟函数,为函数呼叫的决策制定增加了一个额外层次,批评家很快指出C++程序将变得比相同功能的C程序来得大和慢。C++的拥护者则认为,用C写出与虚拟函数等价的代码同样会增加开支。这将是一个还在进行,而且不可能很快得出结论的争论。 8 P; y/ F8 { q2 }' ^! i E
我认为,C++的额外开支只是使用更好的语言的小付出。同样的争论发生在六十年代高级程序语言如COBOL和FORTRAN开始取代汇编成为语言所选的时候。批评家正确的指出使用高级语言编写的程序天生就比手写的汇编语言来得慢,而且必然如此。而高级语言支持者认为这么点小小的性能损失是值得的,因为COBOL和FORTRAN程序更容易编写和维护。
6 Q' A8 r- J- I# L& K$ l优点:组织大型程序时比C语言好得多。很好的支持面向对象机制。通用数据结构,如链表和可增长的阵列组成的库减轻了由于处理低层细节的负担。
9 [ r' }- J! P5 |( w- m/ B+ S缺点:非常大而复杂。与C语言一样存在语法滥用问题。比C慢。大多数编译器没有把整个语言正确的实现。 9 z0 B' D1 k2 D) B! t* f3 H) [
移植性:比C语言好多了,但依然不是很乐观。因为它具有与C语言相同的缺点,大多数可移植性用户界面库都使用C++对象实现。 r( n6 C. C$ p8 v) s
使用C++编写的游戏:非常非常多。大多数的商业游戏是使用C或C++编写的。
" ~ y, }* N4 q7 m1 y资料:最新版的《The C++Programming Language》非常好。作为教程,有两个阵营,一个假定你知道C,另外一个假定你不知道。到目前为止,最好的C++教程是《Who's Afraid of C++》,如果你已经熟知C,那么试一下《Teach Yourself C++》。 P0 k; }& O: @/ N+ V0 m6 F) G( G
3、我该学习C++或是该从C开始
* `8 R( y9 u. D- w我不喜欢这种说法,但它是继“我该使用哪门语言”之后最经常被问及的问题。很不幸,不存在标准答案。你可以自学C并使用它来写程序,从而节省一大堆的时间,不过使用这种方法有两个弊端:
7 {" U0 z" g& M" Z, B你将错过那些面向对象的知识,因为它可能在你的游戏中使得数据建模更有效率的东西。
2 g! `/ [" k0 d5 L. _4 A, v最大的商业游戏,包括第一人称射击游戏很多并没有使用C++。但是,这些程序的作者即使使用老的C的格式,他们通常坚持使用面向对象编程技术。如果你只想学C,至少要自学OO(面向对象)编程技术。OO是仿真(游戏)的完美方法,如果你不学习OO,你将不得不“辛苦”的工作。
+ V( w; g' T5 k4、汇编语言
% o$ n5 N, f C1 q- T6 ?显然,汇编是第一个计算机语言。汇编语言实际上是你计算机处理器实际运行的指令的命令形式表示法。这意味着你将与处理器的底层打交道,比如寄存器和堆栈。如果你要找的是类英语且有相关的自我说明的语言,这不是你想要的。
& U; U+ V d/ u7 S8 ^3 b确切的说,任何你能在其他语言里做到的事情,汇编都能做,只是不那么简单 —这是当然,就像说你既可以开车到某个地方,也可以走路去,只是难易之分。话虽不错,但是新技术让东西变得更易于使用。
# l$ U+ B% p. v总的来说,汇编语言不会在游戏中单独应用。游戏使用汇编主要是使用它那些能提高性能的零零碎碎的部分。比如说,毁灭战士整体使用C来编写,有几段绘图程序使用汇编。这些程序每秒钟要调用数千次,因此,尽可能的简洁将有助于提高游戏的性能。而从C里调用汇编写的函数是相当简单的,因此同时使用两种语言不成问题。 7 u* e- S; F3 F) J# t3 p* q8 m
特别注意:语言的名字叫“汇编”。把汇编语言翻译成真实的机器码的工具叫“汇编程序”。把这门语言叫做“汇编程序”这种用词不当相当普遍,因此,请从这门语言的正确称呼作为起点出发。 S# F7 u: n- o+ L, o" [
优点:最小、最快的语言。汇编高手能编写出比任何其他语言能实现的快得多的程序。你将是利用处理器最新功能的第一人,因为你能直接使用它们。
+ s; ~& Q! n g+ A# T- {6 S8 T缺点:难学、语法晦涩、坚持效率,造成大量额外代码 —不适于心脏虚弱者。
* ]3 [* B* q1 X) U; }+ _5 `移植性:接近零。因为这门语言是为一种单独的处理器设计的,根本没移植性可言。如果使用了某个特殊处理器的扩展功能,你的代码甚至无法移植到其他同类型的处理器上(比如,AMD的3DNow指令是无法移植到其它奔腾系列的处理器上的)。
6 y* |$ m% i) ^8 ]8 U使用汇编编写的游戏:我不知道有什么商业游戏是完全用汇编开发的。不过有些游戏使用汇编完成多数对时间要求苛刻的部分。 1 a6 w, y, J4 k$ p8 O5 a& V4 s
资料:如果你正在找一门汇编语言的文档,你主要要找芯片的文档。网络上如Intel 、AMD 、Motorola 等有一些关于它们的处理器的资料。对于书籍而言,《Assembly Language: Step-By-Step 》是很值得学习的。
% t# W5 d# @$ x+ D# u: G+ b
& K4 U2 G3 ]. { h7 u6 ^# G. c* W$ h
* y, N8 a8 X. Y }: N
: Y8 R+ V- f x- ] |