电子游戏是许多人喜好甚至沉迷的事情。尤为对于程序员来讲,开发游戏是很多人最初学习编程的动力。在以前,我发过一些游戏开发的教程和案例:python
游戏开发也是学习编程的一个很好方式,代码上的各类增长和改动会马上有直观的反馈,让你的学习过程显得不那么枯燥。程序员
不过游戏开发和通常编程初学时接触的程序开发模式有必定的区别,刚上手可能很不适应。我发现网上的游戏开发教程大可能是从某种语言或引擎的开发细节入手,而没有一个提纲挈领式的总体介绍。做为一个有很多年游戏开发经验的开发者,我今天就分享下这方面的经验。面试
电子游戏的原理其实和电影的原理是同样的,都是利用人的“视觉暂留”和“似动现象”,使本来离散的静止图像,看起来是连续的动态效果。算法
这种翻页动画就是最好的例子。只不过电影经过胶片和放映机把它自动化了,而电子游戏更进一步:不但能够自动连续播放,并且过程当中你能够去控制画面中的内容。这有赖于计算机程序的实现,但本质是相通的。编程
咱们日常玩的游戏,其实都是一张张图像连续播放而成。播放的快慢,就是咱们常常听到的“帧率”(FPS)。当你的电脑配置跟不上游戏的要求,运行帧数很低时,会被戏称为“幻灯片”,也正是因为这个缘由。设计模式
基于此,游戏程序的代码在结构上就和通常的程序就有了明显的区别,就是:网络
对于游戏来讲,须要有一个不停执行的循环,不停产生图像,并把它显示到屏幕上。在咱们 pygame 的教程中,你能够很明显地看到这个:数据结构
while True:
...
复制代码
在主循环里进行的各类读写、计算、处理、渲染……构成了游戏的每一帧。有一类游戏开发岗位常见的面试题,我面试 Ubisoft 的时候被问到过,后来也用来问过不少应聘者:架构
以一个 FPS 游戏为例,列举游戏在一帧内须要处理哪些事情?
给出一份个人参考答案:编辑器
这一些列动做须要用到大量 CPU 和 GPU(显卡)的计算。计算的快慢决定了游戏一帧的耗时。一般最耗时的操做在于实时的动画计算和光照渲染。这就是为何当你玩游戏卡顿时,能够经过调低画面效果、关闭软阴影/抗锯齿、下降模型质量等方法改善,或者,买一块更强大的显卡……
游戏程序的主体结构抽象来讲就是这样一个流程:
这里提一个小细节,就是若是咱们计算运动是按照每一帧更新固定的长度来计算,就会出现运算速度快的电脑上帧数很高,运动就很快,反之差的电脑上就很慢(咱们 pygame 教程里的打飞机游戏就是如此)。一般的解决方法,一种是固定帧数,你们都是30帧运行;还有一种就是对运动速度进行修正,最简单的办法就是以固定值乘以上一帧实际消耗的时间。
谈了游戏程序的总体结构,我再来讲几个游戏开发中经常使用设计理念和模式。
首先是面向对象。由于游戏大可能是对现实场景的模拟和抽象,含有众多角色和道具,因此它比其余程序更适合使用面向对象的设计。很多企业在面试时也会用游戏角色的设计来考察面向对象的概念。好比:一个兵种就是一个类,它有父类(角色),有子类(细分兵种),有属性(血量、攻击),有方法(攻击、死亡)。
MVC模式(Model-View-Controller),即把模型、视图、控制器分离开的设计。在游戏开发中,经过 MVC 模式,将游戏玩家、场景及角色的数据(Model)、游戏画面和菜单的显示(View)、游戏的输入控制和逻辑处理(Controller)分离开,会让程序的架构更合理,容易维护和扩展。
状态机。游戏中的角色,常常会有多种状态的切换,好比第一人称射击游戏中的站立、跑动、开镜、下蹲、卧倒等。若是简单的经过一堆 if-else 来管理各类状态的切换,会让代码十分繁琐很难以维护。这时候能够了解下状态机模式。
在实际的开发中,几乎没有团队是从零开始写一个游戏,或多或少都会使用或自研游戏引擎。所谓游戏引擎,就是把咱们前面说到的一些游戏中的通用工做,好比输入处理、物理引擎、动画、场景渲染、网络交互等部分封装起来,让开发者能够专一于游戏自己玩法的开发。像以前提过的 Cocos、Unity,包括 pygame 都属于游戏引擎的范畴,只不过各自的形式和侧重点有所不一样。
在引擎之上,游戏开发团队还会为游戏制做专门的编辑器,以方便游戏策划人员编辑关卡和数值。若是你捣鼓过暴雪的魔兽争霸、星际争霸之类的编辑器,对此必定深有感触。
一个最简单的游戏团队,通常也有三类人:策划、程序、美术。这是游戏开发不可或缺的三个部分。策划负责游戏的玩法、数值、关卡、剧情等设计,程序负责实现功能以及开发相关工具,美术负责各类视觉素材。再多一点可能还会有专门的动画和音效人员;也有我的独立开发者全部工做一肩挑。而现在的大制做游戏,团队则要庞大许多,各类细化分工就远不止这些了。
若是你有志于从事游戏行业,或者想开发出属于本身的游戏,我给出一点建议:
以上是我关于游戏开发的经验与分享。你如有其余想了解的,欢迎留言讨论。
════
其余文章及回答:
编程实训 | 如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 爬虫 | 我用Python | requests | 计算机视觉
欢迎搜索及关注:Crossin的编程教室