选择学习游戏开发的理由
就我本人来说这个理由是很简单的:喜欢玩游戏。当然,我们还可以找出更多的理由:比如游戏开发的一些岗位相对而言竞争可能没有那么激烈,或者选择游戏开发可能没有前后端那样天天和QA、产品打交道,又或者如果选择了一个好组,可能在短暂的时间内实现部分的财务自由(比如某荣耀....)。总之,既然选择了这个方向,我们首先应该厘清选择的理由,然后来看看应该学习什么。
书单(By Milo Yip)
我把这份书单先放在正文前面,大家可以浏览一下,有一个最初的认识:

如果加载有困难,可以直接点这里。
这张图有一个汉化版本,在这里。它包含的书如果有中文版,则已经用中文版替换。
PS:如果这张图太长,在浏览器里面看不清,可以直接浏览器中右键-另存为保存下来看。
游戏开发技术栈
以我浅薄的认识,游戏开发的各个岗位需要的技术栈有很多相同的部分,只是侧重点不同。这里我列出一些共同的技术以及它们的作用,和需要掌握的程度。
c++
无需赘言,90%的游戏开发相关代码库里面你都会看到它,剩下的10%里面可能是引擎的脚本、python写的工具链程序等等。
你需要熟练使用基本的面向对象编程(别连个class都写不出来)、STL等,另外至少得会使用基本的模板。当然,不用掌握meta-programming那种比较高深的东西。你需要熟练在C++下直接进行debug,或者利用IDE的基础设施进行debug。
引擎相关
这个知识是引擎相关的,我在这里不提任何具体的引擎(即使我提了一些流行的,各个大厂总有自己内部自研的,甚至你可能还会参与其中一些引擎的自研),但所有的游戏引擎都有共通之处。比如渲染子系统、物理子系统、声音子系统,等等。总而言之,客户端程序员需要弄清楚引擎的组织,但不用了解到更深的地步。了解到诸如每一帧是如何被处理的、所有脚本的运行顺序这一层就可以了。但引擎程序员不用多说,要深入到源码级别。
网络相关
除了计算机网络基础知识(各种协议等)之外,在游戏里面网络最常用的知识就是同步。各种游戏开发人员都得对游戏中各种同步方式有一定了解。比如最常用的两种大类帧同步和状态同步。它们各自还有一些变体,具体知识不在这篇文章讨论范围之内。服务端程序员需要对此知道的比较清楚,客户端也需要有一些了解。
游戏AI相关
游戏AI和我们现在说的基于ML的AI天差地别(当然在未来融合也是可能的),游戏AI基本还是人手写出来的,基于行为树或者有限状态机的系统。不过要写一个好的AI仍然是有难度的,涉及到寻路、行为选择等一系列比较难预测玩家行为的工作。游戏AI基本上是客户端程序员的“专利”,不过引擎程序员可能也需要有一些涉猎。
物理和动画相关
游戏的物理系统和动画系统是有一定的联系的。因为我们说的“动画”中的“骨骼动画“(就是控制3d游戏里面人物的行动的系统)和物理系统很相似。
物理系统自不必说,需要学一些物理相关的东西,比如拉格朗日力学。另外还得对线性代数有很好的认识。
动画系统我自己研究也不多,不过其中门道也不少(大家津津乐道的动作捕捉就在动画的研究范围之内),如果有兴趣可以自己看书学习。
游戏客户端程序员需要对物理和动画系统有基本的认识,但引擎(物理、动画方向)程序员需要对实现细节有了解。
音频相关
虽然我是个音乐爱好者,但我对这块着实没什么研究。但音频也是游戏中的重要组成部分。对于程序员来说,它的主要研究方向应该是如何让声音更加真实(通过一些混响),或者更有戏剧性。据我所知,Unity中的音频组件是比较简陋的,我想可能其他引擎有比较好的相关组件。
游戏《彩虹六号:围攻》中,制作团队为了让声音听起来更加真实,创造了一套声音模型。比如墙壁上被炸出一个洞之后,和墙壁是完整时的声学特性不同。据我所知,这让《彩虹六号:围攻》玩家对声音的依赖变得很高,增加了游戏的可玩性。
图形学相关
我本人对此了解较多,所以后面的讨论重点将在这里。图形学的组成部分相当繁杂,从硬件到软件均有涉及。除了基础图形学知识之外,不同岗位的人员对此了解有很大的不同。下面我分岗位列一下:
客户端(图形方向):shader编写、渲染性能优化、各个引擎的具体图形相关实现
图形引擎程序员:各个图形API的设计以及在它们之上编写代码、多线程渲染、底层渲染性能优化
TA(技术美术):shader(特效)编写、模型的优化、PBR工作流程(调参等)、渲染性能优化
3D美术(供参考):模型面数(高模、低模)如何影响视觉效果、展UV的方法、PBR工作流程(调参等),各种贴图的绘制
上面的列表很不完全,只是我一时凭印象写出来的,所以仅能作为一定的参考。
图形学的学习我在后面详细讲述。