游戏编程模式

原著:Game Programming Patterns
翻译:dreamana.com

引言

在五年级时,我和我朋友被允许进入一个闲置的放着几台非常破烂的 TRS-80s 的课室。为了启发我们,一位老师找来了份印着一些简单 BASIC 程序的资料给我们捣鼓。

那些计算机上的磁带驱动器是坏的,因此每次我们想运行一些代码,我们不得不仔细地从零开始打。这使我们更偏向于只有几行代码的程序:

10 PRINT "BOBBY IS RADICAL!!!"
20 GOTO 10

也许如果计算机打印足够多次,它就可能魔法般地变为现实了。

即便如此,这个过程是充满了危险的。我们不知道怎样编程,因此就算是一个小小的语法错误我们也是不懂的。如果程序不运作,经常这样的,我们都要从头开始过。

在纸堆的背后是一个真正的怪物:一个占了好几页的密密麻麻的程序。我们仅仅想尝试它都花了很长时间才鼓起勇气,但它是无法抗拒的 ——清单上面的标题是“Tunnels and Trolls(地道与巨怪 ?)”。我们真不知道它用来做什么的,但听起来想是个游戏,还有什么能比你自己编写一个电脑游戏更酷吗?

我们最终都没有让它跑起来,一年之后,我们离开了那课室。(很久以后,当我真正懂了一点 BASIC,我发现它只是一个桌游 (table-top game) 的字符生成器而不是游戏本身。)但木已成舟 ——从那以后,我就想成为一名游戏程序员。

当我十几岁的时候,我们的家买了 Macintosh,带有 QuickBASIC 和后来出的 THINK C。我几乎花了一整个暑假去写游戏。自学是又慢又痛苦的。我已经能轻易地做到一些东西 ——也许是个地图画面或者一点点迷宫。但随着程序增长,变得越来越难了。

许多个夏天我在路易斯安那州抓蛇抓乌龟。要不是外面特别酷热的话,这就更有可能成为一本爬虫学书而不是编程书了。

起初,给我的挑战仅在于将东西显示到屏幕上。之后,难度在于如何编写比我头脑装的还大的程序。不再仅仅读“如何用 C++编程”,我开始试着找关于如何组织 程序的书。

很快过了几年后,一个朋友拿给我一本书:设计模式:可复用面向对象软件的基础 终于!我年轻时就开始期待的书出现了。我一口气从头到尾读了一遍。我仍与我自己的程序斗争着,但看到其他人也斗争着并提出了这些解决方案让我感到欣慰。我感觉好像我终于有一些工具可以使用,而不只是徒手。

这是我们第一次见面,互相介绍五分钟之后,我在他的沙发上坐下并花了几小时来阅读,完全忽略他了。我想,自那以后我要至少要提高一点社交技能了。

2001 年,我找到了我梦寐以求的工作:在 Electronic Arts 当软件工程师。我迫不及待要看一些真正的游戏,看看专业人士是如何组织它们的。像 Madden Football 这样庞大的游戏的架构是怎样的?不同的系统之间是怎样交互的?他们是怎样使一个代码代码库可以在多种平台上运行的?

破解开那些源代码是一种令人震撼和惊奇的体验。有在图形 , AI, 动画和视觉特效上的出色的代码。有懂得怎样榨取 CPU 每个最后周期来合理利用的人。我以前不认为可能 的东西,这些人早就做到了。

但这些出色但代码搭建的架构 往往是一种事后的想法。他们太专注在功能 (features) 上而忽视了组织。模块之间越来越耦合。对于新功能,常常都不管它们是否做得合适就拼接到代码库中。我的幻想破灭了,似乎许多程序员,如果他们曾经砸开一点设计模式,就不会不知道 Singleton(单例)

当然,不是真的那样糟糕。我曾经幻想过,游戏程序员坐在铺满白板的象牙塔里,连续几个星期冷静地讨论架构的细节。现实是,我看到的代码却是那些在紧张工作到快接近最后期限的人写出来的。他们尽力做到最好,而且,我逐渐意识到,他们尽最好常常是非常不错的。我越是花时间在游戏代码上,我就越到发现更多隐藏在背后的才华。

不幸的是,“隐藏”通常是个很好的形容。精华埋藏在代码里头,但许多人都错过了它们。我曾看到同事们努力地重新发明出好的解决方案,恰恰就在他们正用着的同一代码库里有他们想要的例子。

那些问题正是本书旨在解决的。我提炼出在游戏中发现的最好的模式 (patterns) 并在这里呈现它们,那么我们就可以花时间去发明新东西而不是重新发明轮子了。

商店里有什么

市面上已经有大量的游戏编程书籍里。为何要另写一本?

我看到大多数的游戏编程书籍不外乎都落在这两类中:

我都喜欢这两种书,但我觉得他们留下了一些空缺。特定领域但书很少会告诉你怎样将那块代码跟游戏的其他部分交互。你可能会成为一个物理和渲染方面的专家,但你知道如何优雅地将他们绑在一起吗?

第二种书涉及到,但我常发现完整引擎书太单一和太特定类型了。尤其随着移动平台游戏和休闲游戏的崛起,我们处于一个创作各种各样类型的游戏的时期。我们都不再仅仅去克隆 Quake(雷神之锤) 。当你的游戏不匹配那些模子,那些书让你跑遍一个单独都引擎并不适用。

取而代之,我在这里尝试更à la carte(意为:可选择的)。这本书的每一章节都是独立的想法可以让你应用到你的代码中。这样,你可以用一种方式混合搭配它们,以适用于你想做的游戏。

另一个à la carte 风格的例子是广受喜爱的 Game Programming Gems 系列

To be continue