电子游戏是许多人喜爱甚至沉迷的东西。尤其是对于程序员来说,开发游戏是许多人学习编程的最初动力。之前,我发布过一些关于游戏开发的教程和案例:
游戏开发也是学习编程的好方法。代码的各种添加和更改都会立即得到直观的反馈,让你的学习过程不那么枯燥。
然而,游戏开发与你刚开始编程时接触到的一般编程模型有些不同,一开始你可能不太适应。我发现大多数在线游戏开发教程都是从某种语言或引擎的开发细节开始讲起,并没有全面的介绍。作为一名拥有多年游戏开发经验的开发者,我今天想分享一下我在这方面的经验。
电子游戏的工作原理
电子游戏的原理其实和电影是一样的,都是利用人的“视觉暂留”和“似动现象”,让原本离散的静止图像,呈现出连续的动态效果。
这个翻页动画就是最好的例子。只不过电影通过胶片和投影仪把它自动化了游戏开发,电子游戏更进一步:不仅可以自动连续播放,还可以在过程中控制屏幕的内容。这依赖于计算机程序的实现,但本质是一样的。
我们平时玩的游戏,其实都是一个画面一个画面连续播放的,播放的速度就是我们常听到的“帧率”(FPS)。当你的电脑配置跟不上游戏的要求,运行帧率很低的时候,也被戏称为“幻灯片播放”,就是这个道理。
基于此,游戏程序代码的结构与一般程序有显著的不同,即:
主循环
对于游戏来说,需要有一个循环不断执行,不断生成图像并将它们显示在屏幕上。在我们的 pygame 教程中,你可以清楚地看到这一点:
while True:
...
主循环中进行的各种读取、写入、计算、处理、渲染等构成了游戏的每一帧。游戏开发职位有一道常见的面试题。我在育碧面试的时候就被问过这个问题,之后我也问过很多应聘者这个问题:
以FPS游戏为例,游戏在一帧内需要处理哪些事情?
以下是我的参考答案:
事件响应主要是用户输入,比如键盘按键,鼠标移动,鼠标点击,语音等等。
更新游戏元素的运动状态,大多由物理引擎处理,例如移动、跌落、惯性等。
碰撞检测以及碰撞后的事件响应,比如子弹击中角色、拾取物品等。
计算机角色(NPC)的行为,即计算机AI。
网络请求、数据更新、同步等决定游戏分数和胜负。
计算或播放动画效果,例如角色动作、爆炸效果、树木、水面和其他环境效果。
渲染场景,包括灯光效果等,生成最终的显示图像。
这一系列动作需要大量的 CPU 和 GPU(显卡)计算。计算的速度决定了游戏播放一帧所需的时间。通常最耗时的操作是实时动画计算和灯光渲染。这就是为什么当你玩一款卡顿的游戏时,你可以通过降低画面效果、关闭软阴影/抗锯齿、降低模型质量等来改善它,或者购买更强大的显卡……
游戏程序的主要结构抽象描述如下:
这里有个小细节,如果我们通过每帧更新一个固定长度来计算运动,在计算速度快的电脑上,帧率会很高,运动就会很快,而在计算速度慢的电脑上,运动就会很慢(我们pygame教程中的打飞机游戏就是这种情况)。通常的解决办法是固定帧率,大家都按30帧跑;还有一种就是修正运动速度,最简单的办法就是把固定值乘以上一帧实际消耗的时间。
游戏中的设计模式
讨论了游戏程序的整体结构后,我来谈谈游戏开发中一些常用的设计概念和模式。
第一是面向对象。因为游戏多是现实场景的模拟和抽象,人物、道具多,所以比其他程序更适合面向对象设计。很多公司面试时也会用游戏人物的设计来考察面向对象设计的概念。比如一类士兵就是一个类,它有父类(人物)、子类(细分的士兵类型)、属性(生命值、攻击)、方法(攻击、死亡)。
MVC 模式(Model-View-Controller)是一种将模型、视图、控制器分离的设计。在游戏开发中,可以使用 MVC 模式将游戏玩家、场景、角色的数据(Model)、游戏画面和菜单的显示(View)、游戏的输入控制和逻辑处理(Controller)分离,使得程序架构更加合理,更易于维护和扩展。
状态机。游戏中的角色经常会在多个状态之间切换,比如第一人称射击游戏中的站立、奔跑、瞄准、蹲伏、躺下等。如果单纯用一堆 if-else 语句来管理各种状态的切换,代码会非常繁琐,难以维护。这时候就可以了解一下状态机模式。
游戏开发之路
在实际开发中,几乎没有一个团队会从头开始写一款游戏,或多或少都会使用或者开发自己的游戏引擎。所谓游戏引擎,就是把我们前面提到的游戏中的一些常用任务,比如输入处理、物理引擎、动画、场景渲染、网络交互等封装起来,让开发者可以专注于游戏本身的开发。前面提到的 Cocos、Unity、pygame 都属于游戏引擎的范畴,只是它们的表现形式和侧重点有所不同。
在引擎之上,游戏开发团队还会为游戏打造专门的编辑器,方便游戏策划编辑等级和数值。如果你曾经捣鼓过暴雪为魔兽争霸和星际争霸制作的编辑器,你一定会对此有深刻的感受。
一个简单的游戏团队,一般有三类人:策划、编程、美术。这是游戏开发中不可或缺的三个部分。策划负责游戏的玩法、数值、关卡、剧情等的设计,编程负责功能实现和开发相关工具,美术负责各种视觉素材。可能还会有更专门的动画、音效人员;也有个人独立开发者,承担所有的工作。如今的大制作游戏,团队规模要大得多,各种细致的分工远不止这些。
如果你有兴趣在游戏行业工作或者想开发自己的游戏,我有一些建议:
了解游戏开发的基本知识。一般游戏引擎都有官方教程,照着做就可以了。
打下扎实的编程基础,包括数据结构、算法、设计模式等。
多了解各方面知识,多培养兴趣爱好游戏开发,不要只玩游戏。这也许对写代码没有直接帮助,但如果你想自己做游戏,这很有用。
多写点。别太纠结,就从最弱最简单的游戏开始,一个接一个。坚持下去,不会花太长时间,量变会带来质变。
以上就是我对游戏开发的经验和分享,如果还有其他问题,欢迎留言讨论。