游戏客户端程序进阶之路
阶段0
兴趣是最好的老师,对相应领域产生兴趣,才会愿意花费大量的时间精力去钻研,钻研不仅会给自己带来快乐同时也会帮助自己的 职业生涯成长,这样就形成了一个积极的正向激励循环,最终会引领你在这个领域创造价值,取得非凡的成果,成为这个专业方向的专家。从而达到世俗意义上的名利双收。
我们如何知道自己是否对游戏编程领域感兴趣,通过下面列出的几个小测试来确定自己是否喜欢:
- 通过查看shader toy方面的资料,实现一些简单的图形效果
- 通过阅读 《ray tracing in one weekend》这本免费书籍实现cpu端的光线追踪
- 通过阅读《learn opengl》免费网站前面几个章节,学习了解渲染引擎大致工作原理
- 跟随哈佛大学CS50《Introduction To Game Development》做几个小游戏练手
通过这些简单的练习,我们对编程,图形学,游戏引擎有了大概的了解。并且在这些编写程序的过程中,我们大概知道了自己是否喜欢这个行业,以及向往在这个领域大展拳脚。
阶段1-筑基
游戏开发领域的核心功能包括但不限于:图形渲染,游戏业务逻辑(gameplay, ai, physics…),性能优化,音效,工具开发。能在这些专业方向上有所建树,那么我们需要学习磨练自己在这几个方面的知识:
编程语言:
市面上大多数的游戏引擎使用C++实现,游戏渲染使用的代码为shader,shader大多数语法借鉴于C语言,当前C#也是我们的主力业务开发语言,理论上掌握了这三门语言,开发游戏不在话下。所以我们的第一步就是打好C/C++/C#的基础。这里列出最富盛名的几本书:
- C 程序设计语言(第 2 版)
- C++程序设计语言
- C# 8.0 in a Nutshell
- CLR via C#
- 深入理解计算机系统
4和5需要很多前置知识,如果在阅读中遇到困难,不要沮丧,可以将来等自己基础足够坚实,回头慢慢感悟消化也没问题。
编程模式
学会了编程语言,如果我们阅读其他专业人士编写的代码时,感觉很绕,而且非常复杂,不好理解,这属于正常现象。这是因为软件行业发展这些年,有经验的程序员对于常见的业务开发问题已经总结出了相应的开发套路,因为你没有相应的历练和思考,所以看不出这其中的门道,所以这时候我们需要学习一些常用的设计模式。但我们不要局限于学会这些常用的设计模式,古人云:授人以鱼不如授人以渔,学会设计模式只是知道了别人总结的经验,知道别人是如何提出问题,思考解决方案,在方案落地时又权衡考量了那些利弊。才是学到了真谛。这里推荐三本书:
- 游戏编程模式(Bob Nystrom)
- 代码大全 (第二版)
- Head First 设计模式
如果在游戏开发方面经验比较浅,可以从《Head First 设计模式》看,《游戏编程模式》是在EA工作多年的杰出工程师总结的游戏领域几乎所有开发模式,需要客户端开发方面一些背景知识。《代码大全》是一本常看常新的书,不同阶段领悟到的东西不同。
数据结构算法
著名的计算机科学家 Niklaus Wirth说过:算法 + 数据结构 = 程序。虽然计算机的性能不断在提升,但在游戏开发领域,追求更高的运行效率,实现更加绚丽的效果需要的硬件性能永无止境。那么好的数据结构和算法让我们以最聪明+最高效的方式解决问题。这里推荐三本书:
- 数据结构与算法分析:C语言描述
- 算法(普林斯顿出版)
- Mathematics for 3D Game Programming and Computer Grahhics
第二本《算法》被称为最好的算法入门教材,但是java语言背景,所以将它放在第二位。游戏行业有自己细分专业领域方面的数据结构和算法,第三本是最适合我们游戏开发方向。
操作系统
我们开发的程序,调用的接口最后都需要操作系统执行。编程语言中的线程,内存申请,IO读写,网络编程,权限控制,以及其他技术都是对操作系统接口的封装。当我们从编写程序开始,编译程序,运行程序,调试程序,以及优化性能,最后发现都和操作系统有关。操作系统知识博大精深,我们可以从易到难渐进式的方法学习。初始阶段最值得学习的几个领域为:进程,IO,线程,内存管理。这里推荐三份学习资料:
- Unix 环境高级编程
- Windows Via C++
- Mit 操作系统课程 6.1810
工作习惯
做为一个职业程序员,我所认为的好工作习惯:
- 工具使用 (vim, git, svn, vs)
- 任务拆分,按照四象限排好优先级
- 紧急重要 (赶紧搞定)
- 重要不紧急 (逐渐完成,防止升级为紧急重要)
- 紧急不重要 (学会拒绝,越少越好)
- 不紧急不重要 (个人追求)
- 沟通,反馈以及责任
- 一个无沟通的人,在以团队协作的工作模式历史潮流中难有作为
- 反馈要及时,避免影响进度,反馈方式,聊天软件,邮件,电话,紧急性依次提升
- 工作有大小,责任心无大小
- 团队意识,知道我们是一个合作的团队
- 个人成长
- 保持好奇心,多阅读游戏博客,听高手分享,学习他们做事和思考问题的方法
- 不要和其他人比,每天的自己比昨天好
- 学会批判性思考,以及换位思考
- 学会提问
- 认为是重复体力劳动的工作,想办法做成工具
- 做事的心态
- 基础的事并不是简单的事情,基础不牢,地动山摇
- 小事做不好,难成大事
- 不要追求潮流
- 完成一件事的定义
- 明白自己写的功能原理
- 知道和各模块之间关系
- 按规范完成
- 自己做了测试
- 反馈进度
- 添加文档
阶段2-专修
我们具备了基础知识,开始在游戏行业打拼,游戏行业是一门技术壁垒很高的行业,涉及技术非常的庞杂。我们人的精力是有限的,所以当我们基础知识够好的时候,广度够了,这时候就需要在专业领域深挖,提高自己在某个领域的深度,第二阶段的你应给具备如何分辨和寻找优秀资料的能力,所以这里我们不在罗列推荐书籍,相信有悟性有想法的同学通过下面文字里的蛛丝马迹能找到大量优质资料。我从自身了解的知识,从以下几个方面分别讲一下:
图形渲染
- 渲染管线,可以使用游戏引擎自定义和实现目前常见的几种渲染管线(forward. deferred, forward+)
- 图形API(opengl, dx, vulkan),选择学习一个,触类旁通。当我们遇到渲染错误的时候,从shader上无法看出问题,这时候需要我们开启render doc一类的工具查找问题,如果对图形API不熟悉的话,就无法理解相关技术细节
- 渲染算法,游戏渲染用到非常多的算法实现,比如阴影,抗锯齿,光照模型…,在这些技术方面又有非常多的实现方式
- 硬件,当我们实现和优化渲染相关功能时,我们需要知道目前所在硬件平台的参数以及特性,来定制相应管线,比如手机平台和pc,主机平台有巨大的差异
调试/性能优化
- 调试工具熟使用,常用的程序调试工具,以及调试方法都需要掌握,这样我们才能在程序遇到问题时使用工具高效的解决问题
- 汇编语言,了解计算机程序运行原理的都知道计算机最后执行的代码和汇编语言是一一对应的,无论任何编程语言,最终都要转换为机器码执行,所以当我们无法合理解释编写程序执行结果时,就可以查看汇编代码,来理解查找其中的问题
- 操作系统,我们的程序最终是被硬件执行,但程序被执行中间还有操作系统这层,不夸张的说,我们编写的所有程序其实都是操作系统写好接口,我们只是操作系统接口的调用人。所以对操作系统理解的越深入,才能将硬件性能用到极致。另外我们工作中遇到的大多数问题以及所对应的解决方案,操作系统都又类似的问题,以及解决方案,比如虚拟贴图(virtual texture)与之对应的虚拟内存(virtual memory)技术
GamePlay
- 系统架构,目前游戏复杂度越来越高,扩展性,稳定性,易维护测试的设计架构方能驾驭当前游戏开发带来的挑战。这就是让大家学习别人是如何思考发明设计模式的原因,学会了思路,对应不同的开发情景,就能设计出灵活,稳定,易维护,高性能的架构,当然这里面也需要你有操作系统的功底,比如著名的ECS模式,就需要对缓存,多线程,数据功能分离,以及其他技术的组合利用
- AI,AI也是一门专项技术,涉及到寻路,避障,以及角色智能行为,比如War3中的发狂电脑,都是需要编写AI,这个领域有Game AI pro 这个网站,罗列了大量的书籍和GDC分享,就知道这个领域涉及知识多么复杂艰深
- 动画系统,可能我们国内游戏领域没有这个专项,在UE引擎里,动画涉及到动画融合,合批,Montage, 动画状态机,动画物理以及其他。随着我们往高质量游戏开发方向进发,此方向的技术将会被重视
- 资源管理和加载,这里涉及到游戏资源(3d模型,贴图,材质,字体,地图,骨骼动画,物理数据…)的序列化/反序列化,异步加载技术
- 多线程/进程/SIMD技术,随着硬件性能提升,摩尔定律已经到了天花板,多核架构开始发力,这方面的知识也非常值得深入研究
- Spatial(BSP,KD),Occluaion, Lod,以及在渲染系统(RDG),以及编译系统(CDG)应用非常广的依赖图,这些剔除优化手段走进主流
- 内存管理,我们在游戏开发中涉及到内存池,内存回收,内存泄漏,虚拟内存,野指针相关的内存写入,错误读取都会给开发维护程序带来非常大的挑战,业界在这方面也发展了非常多的工具和思路来解决这些问题。同时内存访问速度相比CPU运算速度也是相差甚远,基于这个方向的缓存技术这些年也开始发力。这个领域非常值得花时间来挖掘
GamePlay 可以分的非常细,我这里仅仅是抛砖引玉,大家利用搜索引擎能找到更好的资源。
网络编程
- 网络同步,大多数的游戏都有网络同步功能,一个优秀的网络同步框架涉及到技术非常多,网络上有大量分析的文章,这里就不详细说明了
- 网络协议,网络功能的底层是网络协议,我们如果想开发定制高性能网络框架或者在项目中遇到底层网络传输bug,都需要我们对网络协议底层实现非常熟悉
- 调试和工具使用,当我们遇到网络问题,善于使用工具,能事半功倍
阶段3-大师
开宗立派阶段,对自己专业领域的知识和最新进展了如指掌,有能力点评市面领先产品的不足之处,攻克相关领域难题,将整个行业带领到一个新的阶段。我还远远未达到这个阶段,所以大家看看就好。