mirror of
				https://github.com/cheetahlou/CategoryResourceRepost.git
				synced 2025-11-04 08:13:45 +08:00 
			
		
		
		
	mod
This commit is contained in:
		
							
								
								
									
										78
									
								
								极客时间专栏/从0开始学游戏开发/加餐/复习课 | 带你梳理客户端开发的三个重点.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								极客时间专栏/从0开始学游戏开发/加餐/复习课 | 带你梳理客户端开发的三个重点.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,78 @@
 | 
			
		||||
<audio id="audio" title="复习课 | 带你梳理客户端开发的三个重点" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4e/9f/4ea1c9e719242d820c064e954978b29f.mp3"></audio>
 | 
			
		||||
 | 
			
		||||
我们用了将近两个月的时间,讲述了游戏客户端的开发流程和代码编写,今天我来带你总结并且回顾一下。
 | 
			
		||||
 | 
			
		||||
我这里列了一些编写游戏客户端**你必须要掌握的知识和注意的事项**。希望通过梳理这些知识,能让你对学过的内容有一个全盘的认识和更加深入的理解。
 | 
			
		||||
 | 
			
		||||
## 重点一:客户端开发中4个重要方法
 | 
			
		||||
 | 
			
		||||
**首先,我们来看,设置前后遮挡效果时要用到的一个虚拟概念,Z值。** 2D游戏中其实是不存在这个概念的,因为Z值是高度概念,一般只存在于3D游戏当中。2D游戏的坐标轴,拥有X和Y两种位置。X轴是横向坐标,Y轴是纵向坐标。在斜45度角的游戏,或者需要经常改变前后遮挡位置游戏中,往往才需要加入这个概念。在2D开发中,用好了Z值,能够帮你计算2D游戏中图片的前后位置,在游戏中设置前后遮挡效果的时候就会更加方便。
 | 
			
		||||
 | 
			
		||||
**其次,在2D游戏中制作碰撞检测的时候,可以使用图片相交检测的方法,来替代物理引擎**。像打飞机游戏这样非常简单的2D游戏,是完全不需要使用物理引擎的,我们使用**图片相交检测**的方法,直接写对应的代码就可以。
 | 
			
		||||
 | 
			
		||||
**什么时候才要使用物理引擎呢?这取决于你的代码量和程序编写的复杂程度。**
 | 
			
		||||
 | 
			
		||||
如果碰撞代码非常复杂,占据整个工程量的1/5~1/4,那就可以直接使用物理引擎;如果仅仅用一两个函数就可以搞定,那就可以自己模拟物理碰撞效果来写相应的代码。毕竟2D游戏不比3D游戏,对“拟真”的要求没有那么高。而图片相交检测这样的方法易于编写,且效果也可以满足需求。当然,3D游戏中,往往需要高精度地模拟真实世界的碰撞,这个时候就直接使用物理引擎就好了。
 | 
			
		||||
 | 
			
		||||
**再次,在游戏开发中,保持低耦合度,能够提高你的开发效率,减少你的工作量。** 如果一款游戏引擎没有提供UI模块的话,那需要你编写一套UI模块或者UI库。所谓单独的UI模块,指的是仍然使用游戏引擎作为基础编写代码,但是却独立于游戏本身的逻辑之外,将之抽象出UI模块和UI库。如果UI模块直接融合在游戏里,虽然玩家看起来是一样的效果,但是在代码层面,耦合度却更高,可复用性和可修改性就变得更低,代码质量就更差。
 | 
			
		||||
 | 
			
		||||
同样,在游戏开发中,很多模块都可以提取出来。比如鼠标和键盘的检测,单独提取出来做,变成相应的模块和库;很多的内容都可以进行抽象和独立,有了抽象和独立的模块,这样可以保证游戏版本的迭代不出现问题,你甚至可以拿这一套独立的抽象模块(比如UI模块、鼠标键盘模块等等),继续来做第二款游戏,因为里面很多代码都可以复用。
 | 
			
		||||
 | 
			
		||||
**低耦合度,是游戏开发,甚至编程中都非常重要的思想**。我这里推荐一本书[《设计模式》](https://book.douban.com/subject/1052241/)。这里面对于耦合度的几种模式有详细的讲解。比如工厂模式、代理模式等等,但是不管用什么模式,**低耦合度始终是编程中追求的一种代码方式**。
 | 
			
		||||
 | 
			
		||||
所谓低耦合度,简单理解,就是将功能抽象出来,并且写成一组函数或者类(我们简称为接口)。这些接口有传入传出的参数或者返回值,可以通过外界代码传给接口,接口通过计算,将计算后的结果返回给外部代码。这些接口和别的功能关联性不大,替换了接口,就仅仅替换了算法或者内部实现而已,但是核心功能是一样的。
 | 
			
		||||
 | 
			
		||||
**最后,我想来说一下游戏逻辑。将游戏逻辑放在脚本语言里去写,迭代版本的时候可以不更新主程序,只更新脚本。**(如果不放在脚本语言里,就直接写在硬代码里面。)我们在使用引擎和原生语言开发游戏的时候,只保持核心内容,其他游戏逻辑、游戏配置,特别是在游戏中可活动、可配置、可调节的部分,都提取出来,放到脚本语言里去编写。
 | 
			
		||||
 | 
			
		||||
所谓的主程序,在Windows下就是EXE文件,一般情况下,更新EXE执行文件会导致一系列的更新,比如DLL动态链接库或者某些资源也会更新,所以更新资源包会变得很大。如果纯粹更新脚本文件,那就是几个脚本程序而已。当然这个也要看具体的需求,并不是说一定不更新主程序,如果有迫切需求更新主程序,也是必须要更新的。
 | 
			
		||||
 | 
			
		||||
除此之外,关于客户端其他部分的流程和要注意的细节,我放在一起梳理一下。如果有哪些还不是很清楚,你可以回到对应的文章去复习一下。
 | 
			
		||||
 | 
			
		||||
<li>
 | 
			
		||||
首先,一款成熟的引擎会包含各种编辑器和工具。如果游戏引擎没有提供相应工具,你就必须根据要做的游戏项目,编写方便策划和美术使用的编辑器,包括地图编辑器、关卡编辑器、场景编辑器等等。
 | 
			
		||||
</li>
 | 
			
		||||
<li>
 | 
			
		||||
游戏的网络部分,要尽量保持网络连接和数据传输的安全性,游戏的网络协议可以迭代更新,网络传输的内容和逻辑也可以放在游戏脚本里面去做。
 | 
			
		||||
</li>
 | 
			
		||||
<li>
 | 
			
		||||
游戏的音乐部分,如果引擎不提供,建议使用成熟的音乐库。游戏要合理使用多线程技术,才能保证流畅性。游戏资源打包的包裹格式,如果没有现成的方案,可以使用压缩包的开发库编写,成熟稳定可靠。
 | 
			
		||||
</li>
 | 
			
		||||
<li>
 | 
			
		||||
每个平台的游戏机制都不相同,比如在HTML5游戏里面,它使用的是事件机制,并非普通的循环。
 | 
			
		||||
</li>
 | 
			
		||||
 | 
			
		||||
## 重点二:游戏开发的3大模块
 | 
			
		||||
 | 
			
		||||
这里我按照游戏开发中的三大模块策划、程序、美术,画了一个图。
 | 
			
		||||
 | 
			
		||||
<img src="https://static001.geekbang.org/resource/image/63/25/63c518012e92fb2dea46ffc58c1df125.jpg" alt="" />
 | 
			
		||||
 | 
			
		||||
开发游戏的时候,策划要先行,先出策划稿、UI图、页面迁徙图等等,然后美术开始跟上,紧接着根据策划案开始制作UI、原画、人物、场景等等。程序员开始制作各种编辑器和周边工具(如果引擎没有提供的话),随后美术开始制作地图和各种关卡,程序员开始编写demo。随后就开始内部测试和运行,总结问题和经验,修正和补缺。最后,开始第一个正式版本的开发。正式版本的开发流程和demo版本是一样的,我在[第5讲](https://time.geekbang.org/column/article/8670)的时候已经详细说过demo的作用。
 | 
			
		||||
 | 
			
		||||
在专栏中,我用Pygame来做教学示例,有很多人在留言里问,我想用别的语言编写游戏难道不可以吗?当然是可以的,Pygame只是利用Python+SDL封装的游戏库,而我只是以Pygame为载体,告诉你编写2D游戏引擎的一些核心知识是怎样的。有了核心知识,了解了流程,语言层面就简单地多了。举一反三,换作任何语言、任何引擎都不会有问题了。
 | 
			
		||||
 | 
			
		||||
在这之后,如果你想要进一步学习,或者从事相关的开发工作,你要自己多练习、多思考。如果是在公司里,那就多上手去做项目。游戏的开发流程就是这么回事,要做的东西也就那么多,但是不同的项目,不同种类的游戏,就会有不同的问题出现。每次遇到问题,**多换几种思路去思考,多去了解策划、运营的想法**,而不要只是在“不断填坑”。
 | 
			
		||||
 | 
			
		||||
## 重点三:如何写出过硬的代码?
 | 
			
		||||
 | 
			
		||||
其实,说了这么多,我现在要说我认为最重要的一点。 **无论你是做游戏开发或者别的开发,你都要有过硬的代码基础。** 一款游戏,有再好的引擎,再好的策划,如果代码写得不好,也会影响游戏体验,毕竟引擎只是在底层带动游戏的运行,在上层业务上,还是要依赖代码的牢靠和稳固。
 | 
			
		||||
 | 
			
		||||
我从96年写下第一行代码开始,走过许多的弯路,也经历过许多挫折。**在写代码方面,我或许可以带给你一些直接的经验和警示之谈**。
 | 
			
		||||
 | 
			
		||||
十几年前,当我刚还是个入门级程序员的时候,经历过一个项目,我负责做一个共享内存的接口。事实上写这个接口很简单,用不了多少代码就能完成,但当时我正在学习C++最新的Loki库(后来加入了Boost),觉得里面的模板技巧简直是无敌,所以我在共享内存接口之上又封装了类似Loki模板的方法,最终导致代码过于复杂,很难控制和管理,项目失败。
 | 
			
		||||
 | 
			
		||||
因此,**如果代码不是特别复杂,你大可以直接写功能,不需要从类、框架开始写起,因为这会造成我所犯的那个错误,就是“过度设计”**。举个简单的例子,如果一个“hello word”,却有500行代码,这很明显就是“过度设计”。
 | 
			
		||||
 | 
			
		||||
所以,我的多年的习惯是,**如果一个正常的软件、游戏,或者模块、接口,我都会将普通的功能、重复性高的功能,抽象出来,做成一个模块,特殊的功能、无法重复的,再做成一个模块。代码尽可能不要长,长的代码分割成几部分,放在几个文件里,阅读起来也会很清晰。能写简洁的绝对不要花里胡哨,能用正常技巧的绝对不用小聪明,实在没办法才用小聪明。**
 | 
			
		||||
 | 
			
		||||
对外提供接口要清晰、易于阅读,逻辑要一条一条理顺。有异常,就写异常处理代码;有错误,就处理错误代码;没有问题,再运行下一条。
 | 
			
		||||
 | 
			
		||||
好记性不如烂笔头,写之前先想明白思路,将自己即将要写的代码在脑子里跑一遍,然后将思路记录下来,记在笔记本、电脑、手机哪里都可以。这样写出的代码比直接上手写,速度上会慢很多,但是出错概率极低。直接写你可能一下子就写完,但还要修修补补,调试一整天,事实上,这比思考虑好了再写还要慢。
 | 
			
		||||
 | 
			
		||||
最后,还是那句话,不管是编写大型游戏还是一款小游戏,还是做任何项目,都离不开踏踏实实把代码写好。毕竟这是基础。如果你总想着什么多少天速成法,快速入门、快速编写出一款脍炙人口的游戏,用户上几百万,这是不存在的。游戏开发,应该说任何程序开发,都不适合任何想要走捷径的人。真正聪明的人,都应该知道学习本来也没有什么捷径。
 | 
			
		||||
 | 
			
		||||
经过这两个月的学习,不知道你对游戏开发有没有更深入的认识?关于游戏开发或者编程,你还有什么想要了解的,你可以继续在留言区写下想法。
 | 
			
		||||
 | 
			
		||||
我在后面的挑战中继续等待你的到来!
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										114
									
								
								极客时间专栏/从0开始学游戏开发/加餐/课后阅读 | 游戏开发工程师学习路径(上).md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								极客时间专栏/从0开始学游戏开发/加餐/课后阅读 | 游戏开发工程师学习路径(上).md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,114 @@
 | 
			
		||||
<audio id="audio" title="课后阅读 | 游戏开发工程师学习路径(上)" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/91/06/9140756b0f282fa0987322b04fe18f06.mp3"></audio>
 | 
			
		||||
 | 
			
		||||
整个开发流程和内容我已经讲完了。你现在已经不是一个完全零基础的小白了。作为一个满心想要进入游戏开发行业的人,或者想要在游戏行业深耕,你可能要问了,后续的路,该怎么走呢?今天,我就来和你聊一聊这个内容。
 | 
			
		||||
 | 
			
		||||
我会通过这份看似很长的必读书单,先给你搭建一个学习路径,然后从底层知识和游戏开发这两方面分别讲讲,想成为游戏开发工程师,应该掌握哪些知识。
 | 
			
		||||
 | 
			
		||||
我在专栏里讲了很多具体的操作,作为初学者,把这些彻底掌握,其实已经差不多了。但是想要进阶,成为一名真正的游戏开发工程师,你还有很长的路要走。从业二十余年,我见过不少的年轻人,抱着对游戏的一腔热血,一头扎进游戏开发,想着自己有一天也能开发出一款爆款游戏,从此“走上人生巅峰”。
 | 
			
		||||
 | 
			
		||||
然而走着走着,发现要学的东西太多,无从下手,直接放弃;或者学了之后,因为一直写不出什么项目,也放弃了。就好像去少林寺学武功的人,方丈让他先捆着沙包登山、挑水,他以为这并不是学武术,因此就放弃了。
 | 
			
		||||
 | 
			
		||||
事实上游戏开发,甚至编程都是这样,你首先要学好基础知识,有了扎实的基础,才可能去做更多的事。道理我想你都懂,我就不多啰嗦啦。我们进入正题。
 | 
			
		||||
 | 
			
		||||
还记得,在专栏最开始的时候,我专门写过[游戏的分类](https://time.geekbang.org/column/article/8104),按呈现效果,我们可以粗略分为2D游戏和3D游戏;按硬件,我们可以分为主机游戏、电脑游戏、移动游戏和电视机游戏。但是,如果从真正的开发角度,我会把游戏开发分为**原生游戏开发**和**网页游戏开发**。
 | 
			
		||||
 | 
			
		||||
为什么这么分呢?首先,我这个分类中,并没有把网络服务器端的内容放进来,而只是针对游戏客户端部分。我将它分为原生客户端(PC、手机非HTML5原生App)和网页客户端(PC端页游、HTML5游戏、手机端HTML5游戏、微信小游戏)。
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
我们先从原生客户端讲起。
 | 
			
		||||
 | 
			
		||||
在专栏里,我通过Pygame做了示例,但是碍于你可能不仅是个游戏开发新手,还可能是个编程新手,而我们专栏的侧重点在于帮你认识、了解游戏开发流程,知道游戏开发是怎么一回事,对于底层的知识,我其实没有过多的去介绍。
 | 
			
		||||
 | 
			
		||||
我本身是写服务器端的,对于底层知识研究了很多,所以,我深知底层知识对于一个真正想要在游戏开发之路走得长远的人的重要性。学习的过程,我没有办法替你做,但是我想应该有那么一些经验还可以跟你讲一讲,不至于你在一些可以避免走弯路的地方,浪费掉许多时间。
 | 
			
		||||
 | 
			
		||||
开发原生客户端游戏需要非常系统的底层知识。这里的底层知识指的是计算机(移动设备)的硬件底层知识,比如内存、CPU、图形显卡等等。当然如果要学得全面,你还可以学习物理引擎、音频等等。
 | 
			
		||||
 | 
			
		||||
## 想走捷径,去学C++吧!
 | 
			
		||||
 | 
			
		||||
**如果你的学习时间并不充裕,或者非常迫切地想知道“底层是什么,底层做了点什么”,想相对快速地能学习到底层知识,那么我推荐你直接学习C++。**
 | 
			
		||||
 | 
			
		||||
首先从执行效率看,C++的执行效率仅次于汇编,约等于C。如果要编写更底层的操作系统,因为语法糖太多,你不知道编译器在背后做了什么事情,C++语言将无法“直接”掌控底层设备。所以要写操作系统,需要对C++编译器进行针对性改造。
 | 
			
		||||
 | 
			
		||||
我们再往上看,如果要编写更上层的应用,比如桌面应用、动态网页应用,这些是C++经历过的“银弹”时代。90年代到2007年左右,几乎电脑上所有应用都有C++的身影,但是现在,桌面应用完全可以使用C#来编写。
 | 
			
		||||
 | 
			
		||||
网页端就更不用说了,PHP、JavaScript、Python每一个都能比C++做得更快、更完美。但是在游戏开发中,既需要执行速度,相对地,又需要开发速度,综合下来,只有C++最适合。
 | 
			
		||||
 | 
			
		||||
所以,学习C++,会让你对底层知识有了一个大致的了解,但是如果你没有更进阶地学习C或者汇编,那么你的知识面就停留在类、内存分配、对象等层面。
 | 
			
		||||
 | 
			
		||||
作为二十多年的C++程序员,我这里有几个学习C++的心得想跟你分享。
 | 
			
		||||
 | 
			
		||||
首先,C++和C语言并不是一门语言。它们之间的语法结构看起来虽然“相似”,但C++相对于C更像是瑞士军刀和匕首之间的关系。它们都有刀的功能,而C++除了刀的功能,还有更多的功能。
 | 
			
		||||
 | 
			
		||||
其次,C++是做减法而非加法。把C++所有特性学完会耗费你极大的精力,注意是极大,不是大量。每一种特性背后都包裹着无数语法糖衣和编译器的“自动化”动作,使用C++的人当中,有一部分人经常会“走火入魔”,专门研究一些奇技淫巧的技巧。
 | 
			
		||||
 | 
			
		||||
所以最好的方法是,**不要执着于语言特性**,因为两个不同的编译器,可能编译结果都会不同,比如一个会出错,一个会通过,但只要略作修改,就能运行。只要不影响具体最终软件的执行,就可以了。C++特性太多,选择一种或者两种特性来编写整个软件,才是发挥C++最大功效的方法。
 | 
			
		||||
 | 
			
		||||
最后,大道至简,这对于整个产品、架构、编码,都是一句适用的箴言。当然对C++也是如此,只有用最简略的方法来编写代码,才会让代码快速成型。C++比C多了太多快速搭建的语法功能。尽量利用它的优点(比如面向对象、模板等等),就能发挥出语言最大的特长。
 | 
			
		||||
 | 
			
		||||
## 走这个路径,基础更扎实!
 | 
			
		||||
 | 
			
		||||
如果你有较宽裕的时间学习编程,也希望学习到更多的底层知识,对计算机有一个全面的掌握和了解,那么我推荐你用以下的这个更全面的路径来学习。
 | 
			
		||||
 | 
			
		||||
以我的经验,我建议你先去学习一下C语言。为什么呢?因为C语言是汇编的封装,C语言的一句语句,可以是汇编的几条指令,虽然每个C编译器最终生成的汇编指令可能不同,但大致方向是一致的。
 | 
			
		||||
 | 
			
		||||
其次,学习C语言能让你从基础的语言语法了解计算机编程是怎么回事。C语言是99.9%的电子设备的基础语言(剩下的0.01是汇编)。
 | 
			
		||||
 | 
			
		||||
学习C语言有太多的入门书。在这里我推荐[《C Prime Plus》](https://book.douban.com/subject/1240002/),绝对的C语言入门经典教材。[《C Programming Language》](https://book.douban.com/subject/1139336/),读完 《C Prime Plus》之后再去读这本书,绝对会让你了解什么是高手所写的书。
 | 
			
		||||
 | 
			
		||||
看完了《C Programming Language》之后,你除了是C程序员之外,俨然是一个不错的Linux用户了。
 | 
			
		||||
 | 
			
		||||
学习完C语言后,你可以学习汇编语言。有了C语言的基础,对编程、地址操作、位操作这些基础,学习汇编就会相对容易。
 | 
			
		||||
 | 
			
		||||
估计看到汇编语言这几个字,很多人就望而却步了。但是,我想说,**没有比汇编更适合学习底层知识的语言了**。
 | 
			
		||||
 | 
			
		||||
毕竟在现实中,除非你编写的是芯片或者操作系统(现在编写芯片或者操作系统也大量使用C语言),只有占那1%的启动部分代码会使用汇编。这么看,使用汇编编程的人真的非常少,而且它本身也不适合编写大型项目。
 | 
			
		||||
 | 
			
		||||
你可能要问了,为什么你还推荐我从汇编开始学呢?学习汇编的意义在哪里?
 | 
			
		||||
 | 
			
		||||
我们先来看一段指令。
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 pushl %ebp
 | 
			
		||||
 | 
			
		||||
 movl %esp,%ebp
 | 
			
		||||
 | 
			
		||||
 subl $8,%esp
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
在汇编里,这些指令就代表着CPU的指令操作。在编写中级、高级语言,需要调试代码的时候,如果没有调试信息,最终都会落到汇编语言这里。这时候,汇编语言就是你的最后一道防线,学习了汇编,你就能快速、深入地定位程序的问题所在。
 | 
			
		||||
 | 
			
		||||
所以,**学习汇编的意义就是,你能在脑中完全掌握电脑的运行规律和运作逻辑**,比如内存寻址操作、寄存器操作、加减操作、CPU指令等等。
 | 
			
		||||
 | 
			
		||||
学习汇编有一本书,是绝对的入门级好书,能够把深奥枯燥的机器知识讲得生动活泼,那就是王爽的[《汇编语言》](https://book.douban.com/subject/3037562/)。
 | 
			
		||||
 | 
			
		||||
学习了汇编语言,也会对你的C语言知识有一个本质上的巩固。所以结合C和汇编,指针不再是头疼的问题,因为你已经知道在汇编中的地址是如何操作的。
 | 
			
		||||
 | 
			
		||||
C语言看起来就好像把汇编进行了一次朴素的包装,你不再需要强制记忆寄存器和指令,定义一个变量就知道汇编语言是怎么做的,这对于你的C语言来说,是有绝对帮助意义的。
 | 
			
		||||
 | 
			
		||||
**一般人提倡的学习路径是由浅入深,如果你想一直在技术领域深耕下去,我建议你走一条由难到易的学习路径。**
 | 
			
		||||
 | 
			
		||||
因为,越高级的编程语言越接近人类的思维方式,这种思维会固化你的编程思维,让你在之后的学习过程中,无法更深层次地理解底层机器语言的沟通方式,学习起来就会比较困难。先学习底层知识,这样你在后续的高级语言的学习中,就属于“降维打击”,学习起来就相对轻松和快速。
 | 
			
		||||
 | 
			
		||||
除此之外,如果你已经是一名程序员,你应该很能体会,你的工作将会越来越忙,几乎没有时间学习新的知识,而学习能力是一名程序员必备的基本能力。
 | 
			
		||||
 | 
			
		||||
接下来,你还是需要学C++语言了。具体原因其实我刚才也说了,游戏引擎绝大部分使用C++编写,也有一小部分是使用C语言或者汇编编写的,比如Allegro。
 | 
			
		||||
 | 
			
		||||
如果你要学习C++语言,学苑出版社出版的HerbertSchildt写的《C++从入门到精通》,这本书一定不能错过,它是我的C++启蒙书。唯一可惜的是,这本书年头有些久了,我的书还没有找到,但是我至今对书的内容都记忆犹新。这本书后面的小习题,绝对能让你在学完这本书之后,对C++了解的非常透彻和深刻。
 | 
			
		||||
 | 
			
		||||
另外,[《深](https://book.douban.com/subject/1091086/)[度探索](https://book.douban.com/subject/1091086/)[C++对象模型》](https://book.douban.com/subject/1091086/)[《C++ Programming Language》](https://book.douban.com/subject/1099889/)[《C++语言的设计与演化》](https://book.douban.com/subject/1096216/)也是必看书籍。前一本能让你了解C++对象模型,从底层了解C++的机制。后两本出自C++之父Bjarne Stroustrup之手。
 | 
			
		||||
 | 
			
		||||
从C++开始设计到现在,为何会如此演化和设计,语言的背后又是怎样的故事,除了语言的基础知识,也会有一些小小的故事。另外,如果你的知识面和时间允许,我建议你最好去看《C++ Programming Language》的原版,因为只有原版是原汁原味,不会有被翻译偏差影响的。
 | 
			
		||||
 | 
			
		||||
现在,我们已经将一幢大楼的“地基”都搭建好了。
 | 
			
		||||
 | 
			
		||||
## 学完这些,要多久啊?
 | 
			
		||||
 | 
			
		||||
你可能会问了,从开始学习底层知识,到对知识有了解并且能顺利写出软件需要多久呢?因人而异,有人是计算机系的,有人是野路子,有人对计算机特别有天赋,有人虽然不聪明但是非常勤奋,每个人的学习曲线和学习路径以及最终学会的时间都是不一样的。
 | 
			
		||||
 | 
			
		||||
但是一般来说,要从C到汇编再到C++,一直到能编写成熟的代码,平均下来需要5~7年的时间。我没有做过精细地统计,但是我想,按照大学四年的学习时间,从学习到实践,再加上毕业1~3年的实践深入,5~7年的时间基本是差不多的。你觉得呢?
 | 
			
		||||
 | 
			
		||||
今天这些内容主要涉及游戏开发的底层知识。说起来很容易,做起来却一点都不容易。有了这些基本功,下一节,我会推荐一些游戏原理和机制相关的书籍。希望我的分享对你有帮助。
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										49
									
								
								极客时间专栏/从0开始学游戏开发/加餐/课后阅读 | 游戏开发工程师学习路径(下).md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								极客时间专栏/从0开始学游戏开发/加餐/课后阅读 | 游戏开发工程师学习路径(下).md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
<audio id="audio" title="课后阅读 | 游戏开发工程师学习路径(下)" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/56/ae/56907724b65ca600ea9c87472d8b4aae.mp3"></audio>
 | 
			
		||||
 | 
			
		||||
上一节,我讲了一些底层知识和编程语言。搭好了底子,接下来,你需要掌握一些游戏的常规原理和机制。这里我也为你准备了一份学习书单。
 | 
			
		||||
 | 
			
		||||
## 游戏设计
 | 
			
		||||
 | 
			
		||||
[《游戏机制》](https://book.douban.com/subject/25859579/),这是一本策划和程序员都可以看的书。在游戏设计中,游戏机制的设计,决定着游戏中的呈现效果,直接影响着玩家体验。而这本书就是教你如何打造出挑战丰富、乐趣十足、平衡良好的可玩性的游戏机制。它结合了很多实用案例,从不同角度介绍和阐述了游戏机制,介绍了用于构建和模拟游戏机制的Machinations工具。
 | 
			
		||||
 | 
			
		||||
[《游戏设计的100个原理》](https://book.douban.com/subject/26318335/)做游戏开发的人,基本上自己都是非常喜欢游戏的,肯定玩过不少游戏。但是估计你对游戏设计背后的原理性的东西,了解的不会很多。这本书就是讲很多原理性的东西,让你从更专业的角度来看你以前玩过的游戏,毕竟游戏设计其实更像是一门哲学。
 | 
			
		||||
 | 
			
		||||
[《Windows游戏编程大师技巧》](https://book.douban.com/subject/1230286/),这是一本经典书籍,属于游戏开发启蒙教材,它涉及了开发的基础知识和理论、开发技巧这些问题。有一点点汇编、C/C++语言基础,看这些就不会觉得特别难了。
 | 
			
		||||
 | 
			
		||||
## 2D和3D编程
 | 
			
		||||
 | 
			
		||||
接下来,关于2D编程,我们可以看[《Cocos2dX游戏开发技术精解》](https://book.douban.com/subject/24733748/),这是一本让你一下子就能学习2D引擎且直接上手的书籍,几乎是学习2D游戏必备。
 | 
			
		||||
 | 
			
		||||
《Unity 4.x 2D游戏开发基础教程》是一本利用Unity编写2D游戏的教程书籍。另外有一本非常难买到的书[《2D Graphics Programming for Games》](https://book.douban.com/subject/20116832/),目前只有英文版,如果你能找到电子书也可以阅读一下。
 | 
			
		||||
 | 
			
		||||
毕竟3D游戏大行其道,但是它和2D游戏的路数又是非常不一样的。加上很多人上来就想做3D游戏,那关于3D开发,这几本书必看不可。
 | 
			
		||||
 | 
			
		||||
[《3D游戏编程大师技巧》](https://book.douban.com/subject/1321769/)[《Unity 3.x游戏开发实例》](https://book.douban.com/subject/25916788/)[《3D游戏开发大全》](https://book.douban.com/subject/1488758/)。第一本书可以让你很轻松地就了解3D游戏的编程基础知识,第二、三本书都是属于利用引擎来编写实例的,你可以在这些例子中获取更多的实战经验。
 | 
			
		||||
 | 
			
		||||
而《3D游戏开发大全》以Torque引擎来作为切入点,让你看到更多的技术。比如,游戏建模技术、人工智能技术、玩家控制技术等等游戏开发的细节。看完这三本书你就会对3D游戏编程有一个本质的了解。
 | 
			
		||||
 | 
			
		||||
做为3D游戏开发,还要知道3D模型、贴图、骨骼等一些3D美术知识。从基础开始学起的话,我推荐[《DirectX 9.0 3D游戏开发编程基础》](https://book.douban.com/subject/2111771/)。这本书介绍了一些必备的数学工具,涵盖了Direct 3D中几乎所有基本运算,以及如何使用Direct 3D来实现3D游戏。
 | 
			
		||||
 | 
			
		||||
## 网页游戏开发
 | 
			
		||||
 | 
			
		||||
原生游戏客户端开发的学习重点在编程语言上,所以,其实你学了什么编程语言,几乎可以决定你会从事什么样的开发工作。而网页游戏相对来说就简单得多。
 | 
			
		||||
 | 
			
		||||
想要学习网页游戏制作,其实就是学习CSS3、HTML5以及JavaScript的知识。这方面的学习资料非常之多,网上一搜就能出来一大堆。其实你只要把每个方面专心学完一本书,把基本知识和核心知识搞懂了,结合一些项目实战有针对性的去练习就可以了,入门还是非常容易的。
 | 
			
		||||
 | 
			
		||||
比如,看些大家都推荐的经典书籍[《响应式Web设计》](https://book.douban.com/subject/20390374/)[《HTML5程序设计》](https://book.douban.com/subject/10608238/)等等。
 | 
			
		||||
 | 
			
		||||
最初,你需要学习最基础的HTML语言语法。HTML5本身对初学者就非常友好。
 | 
			
		||||
 | 
			
		||||
[《JavaScript语言精粹》](https://book.douban.com/subject/3590768/)也是必读的书籍。JavaScript语言的书籍非常非常多。这本书的内容就像它的书名,真是是精粹,从语法、函数、对象、数组、正则等等特性来介绍JavaScript语言的精髓,让你能真正掌握并高效地使用JavaScript,非常推荐。
 | 
			
		||||
 | 
			
		||||
到这里,按照原生游戏开发和网页游戏开发的分类,我们的游戏学习路径和书籍介绍已经写得差不多了,在这里再向你介绍两本与游戏无关却与编程有关的书籍[《设计模式》](https://book.douban.com/subject/1052241/)[《代码大全》](https://book.douban.com/subject/1477390/)。
 | 
			
		||||
 | 
			
		||||
这两本书能让你编写代码的水平提升一个层次,提高编程水平是让自己的职业化道路越走越好的一条唯一途径。世上没有捷径,勤学苦练,多看多写才是根本。游戏开发的基础是编程基础,有了扎实的底子,往后走提升得才会比较快。
 | 
			
		||||
 | 
			
		||||
一百多年前,福楼拜曾在一封信里写到:“谁要能熟读五六本书,就可成为大学问家了。”所以,我列的这些书,你能读完最好。但我知道,对大多数人来说,肯定是读不完的。你可以根据自己的情况做个筛选,有针对、有选择的去学习。
 | 
			
		||||
 | 
			
		||||
如果你想从事H5游戏开发的,你可以着重学习HTML和CSS;如果想学习服务器端开发的话,可以着重学习Socket开发和TCP/IP相关的书籍;如果想学习客户端知识,比如3D客户端的话,可以注重学习Unity或者虚幻引擎为载体的书籍。
 | 
			
		||||
 | 
			
		||||
希望今天的分享对你有帮助。
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user