首页 > 代码库 > 优秀游戏程序员学习资料推荐

优秀游戏程序员学习资料推荐

这两天给单位的技术做的一次学习材料推荐培训,直接ppt上拷过来的。


优秀游戏程序员学习资料推荐

主讲人:臧旭

前言

今天提到的纯粹是我个人心得和理解,可能片面,可能以偏概全。

目的是给大家做一定的指引作用,想让大家知道自己还有哪些可以去学习,还有哪些不足,我们距离优秀还有多远。

对我今天提到的东西,如果大家有时间,一定要去深入了解,在技术的道路上才有可能看得远、走得稳、飞得高。

另外有一句对所有技术人员想说的话:

学无止境。切忌坐井观天、有一点小小的成就就沾沾自喜、止足不前。


扎实的基础

万丈高楼平地起,勿在浮沙建高楼。

有扎实的计算机理论基础:

1.对计算机知识体系有全局的理解。【广度】

2. 对任何一门技术都将有更深刻和透彻的理解。【深度】


数学基础

数学是基础中的基础。

不会数学推导,你就看不懂各种文献,也不会明白各种算法的个中所以。

不会数学推导,在3D道路上你更将寸步难行。

当然,你也可以选择让度娘给你一个别人写好的现成的。

但是,对内部原理和推导一窍不通我们就不能变通?网上找不到现成的怎么办?


1.高等数学

积分和微分在任何数学场合都是基本功。

2.线性代数与空间解析几何

向量分析、矩阵分析。3D图形学中最重要的组成部分。

3.基础物理

刚体力学、柔体力学、流体力学,游戏开发中非常常见。

4.离散数学

数据结构的理论基础。

5.概率统计、模糊数学

人工智能的理论工具。


计算机学科专业基础

1.计算机组成原理与体系结构
2.汇编语言程序设计
3.操作系统
4.数据结构
5.程序设计算法
6.计算机网络
7.数据库原理
8.编译原理
9.C/C++语言设计

计算机组成原理与体系结构

组成原理和体系结构可以合并在一起,也可以单独的拆分为两个科目。

两个科目相辅相成,各有重叠的部分。但是总体都讲述了计算机的各个硬件组成部分,各个部分的运作原理以及各个部分之间是如何互通协作的。

总体来说,两个科目都偏硬,但是组成原理偏硬更多,体系结构相比略偏软。

这个是基础中的基础,不学习这个,我们就不明白计算机到底是什么,也不会深入地理解计算机是怎么运作的。当然,我们肯定更不明白自己写的程序本质上到底是什么了。

推荐材料:

找一本高校教材就可以了,推荐清华大学出版社的


汇编语言程序设计

最低级的语言。

学习的目的:

1.深入地理解高级语言的语言特性。高级语言只是给低级语言穿上了华丽的外衣,我们要想知道它到底是什么,必须查看汇编代码。
2.深入理解编译器。编译器会给我们优化,但是很多时候可能好心没做成好事,这个时候必须查看汇编代码才能看出猫腻。
3.性能优化。编译器的汇编指令优化已经很好,但是想要追求更好,自己写汇编代码是最好的选择。
4.深入理解系统内核。比如不开源的windows,那么多漏洞别人都是怎么发现的?当然是通过阅读反汇编代码了。
5.打发大家的一些无聊时间,有强大的汇编基础和操作系统基础,破解和逆向分析都不会难。
6.有时间最好能独立开发一款反汇编工具,对汇编和逆向的帮助会很大。

推荐材料:

王爽 《汇编语言》

《C++反汇编与逆向分析技术揭秘》

《天书夜谈-从汇编语言到Windows内核编程》

《加密与解密》


操作系统

操作系统是大家很熟悉的名词。不言而喻,基础中的基础。

学习目的:

1.进程、线程、cpu调度、死锁、内存管理、文件管理、I/O系统,这几块都是我们写程序的时候和操作系统打交道最多的地方。必须要有深厚的操作系统系统理论基础来知道我们实践。百度什么的只能给你吃一顿快餐,很难让你有深入地理解。
2.主流的操作系统无非linux和windows,但是他们的设计初衷是大同小异的,有通用的理论我们才能更好地去实践。

推荐材料:

恐龙书《操作系统概念》(《Operating System Concepts 》)

于渊 《自己动手写操作系统》


数据结构

不懂数据结构的程序员就不是一个程序员。

数据结构内容非常多,建议大家把每种基础类型的数据结构都仔细地学习一下,一定全部要自己动手写程序实现一遍,还要自己动手计算最好、最坏以及一般时间复杂度和空间复杂度。

对于数据结构的学习千万不能马虎,绝对不能眼高手低,能完整地没有bug地实现任何一个基础的数据结构都不是一件容易的事情。

除了基础的那些之外,一些常用的变种也很重要。值得花时间学习和实践。

推荐材料:

严蔚敏 《数据结构》


程序设计算法

这里的程序设计算法,指的是六大基础算法。大家如果对ACM比赛有所了解,应该清楚通用计算机算法还有很多。但是对于我们平时遇到的问题,相信有这六大基础算法已经足够。

主要是:递归与分治、动态规划、贪心、回溯、分支界限、线性规划

和学习数据结构一样,重要的是理解和动手实践。

推荐材料:

王晓东 《算法设计与分析》+《算法设计与实验题解》(推荐这个,后面两个太厚,讲的太多、太杂,而且《计算机程序设计艺术》三卷难度非常大)

《算法导论》

《计算机程序设计艺术》三卷

北大和浙大的ACM在线judge (无聊的时候做一两条稍有难度的题目也是非常有意思的)


计算机网络

和操作系统一样,所谓计算机网络基础,更加偏重的是理论,一层层地剖析七层网络协议,同时对各种类型的网络、物理媒介、网络拓扑、各种网络算法都有详细的描述。我们平时所关心的SOCKET、TCP、UDP之类的在整个计算机网络的知识体系中只是一滴水而已。

为什么要学习?

不学习这个,我们除了会用socket建立连接、发送消息、知道TCP有三次握手之类的之外,其他还知道什么呢?

所以再一次强调,学无止境,切忌坐井观天。

推荐材料:

潘爱民译《计算机网络》

《自顶向下网络设计》


数据库原理

数据库应该是一个很重要的学科。它的应用非常广泛。不要一想到数据库,就想到服务器开发人员用的。任何地方都可以使用数据库。

数据库原理主要描述的是关系模型、范式以及SQL规范。数据库原理是数据仓库、数据挖掘之类相关学科的理论基础。

建议大家学习使用任何的数据库之前,最好预先学习一下理论。不然建表和写SQL的时候会出现很多不合理的地方。

另外,对于数据库来说,自己动手写一个小型DBMS(数据库管理系统)的收获是最大的。因为实现一个DBMS涉及到的知识点太多了,需要丰富的编译原理、数据结构、操作系统知识。是一个把知识融会贯通的好机会。

推荐材料:

没什么特别优秀的理论书

一定要自己动手实现一个DBMS


编译原理

编译原理,当然讲的最多的是和编译器相关的原理知识。

为什么要学习:

1.帮助我们理解平时写的高级程序语言最终是如何变成指令码的。
2.编译原理里面有限状态机的概念非常有用,编译器也是它的一个应用而已。

推荐材料:

龙书 《编译原理》

《加载器和链接器》

《程序员的自我修养:加载、链接和库》

LLVM源代码


C/C++

C++有非常强的语言特性,熟悉C++,对于任何一门其他的语言都能触类旁通。

而且,阅读高级C++代码绝非易事,绕过这道坎,我们阅读任何语言,任何代码都是小菜一碟。

C++的范畴太太广泛,水太深,需要学习的东西也太多。

推荐材料:

我们现在对C++的使用只是入门级别而已。


C/C++推荐书籍

语言基础:

《21天学通C++》

C++圣经《The C++ Programming Language》

《Effective C++》

《More Effective C++》

《深入理解C++11:C++11新特性解析与应用》

《深度探索C++对象模型 》(《 Inside the C++ Object Model 》)


模板,模板元,泛型,库:

《STL源码剖析》

《C++ Templates中文版 》(《 C++Templates:The Complete Guide 》)

《C++模板元编程》(《C++ Template Metaprograming:Concepts, Tools, and Techniques from Boost and Beyond》)

《深入解析ATL 》(《 ATL Internals 》)

《COM原理与应用》

《 Boost程序库完全开发指南——深入C++“准”标准库》

《深入浅出MFC》


夯实基础之后我们做什么?

看了前面一大串的知识和书籍,大家可能头已经晕了。

但是,

计算机是一门学科,不是大妈做手抓饼。你要想做一个真正优秀的程序员,前面的全部都是必须!

而且熟悉其中任何一个点都绝不是一天两天的事情。

我们至少要做好前面的80%的积淀,不然我觉得基本上就不要深入后面的内容了。


推开门

计算机是一门科学,它有无数的分支和小学科。

从技术选型和实现的角度来看,更是不计其数。

我们今天就关注我们现在做的:游戏编程。


语言类

语言只是工具,是我们为了实现完成一款游戏这一目的的工具。

高级语言一般分为静态(类型)语言和动态(类型)语言。

简单的区分手段(不一定):需要预编译的就是静态语言,不需要预编译的就是动态语言。所有的脚本语言都是动态语言。

深入了解语言是如何编译或者解释的,有助于我们更加深入地理解语言是如何实现、内部是如何运作的。基于此,我们才能更加灵活、高效、高性能地使用语言。

推荐材料:

基础的就是编译原理,但是现在已经有了很多其他的编译技术(如相对于AOT的JIT)。

要想对语言有更多的了解,可以直接看开源语言的源代码,或者查阅官方的文档。


建议大家要了解的语言,打星的是要熟练掌握的语言:

宿主语言:

C++(*)

Java(*)

Objective-C(*)

C#(*)

粘合剂语言:

Lua(*)

ActionScript

JavaScript

工具语言:

Linux Shell脚本(*)

Windows批处理脚本(*)

Python(*)


脚本-Lua

学习一门脚本,不仅仅要学习它的语法,更重要的是要学习它的脚本引擎。Lua作为开源语言,以高性能和易使用而闻名。每一个游戏程序员(不管是服务器开发还是客户端开发),都值得投入大量的时间把它学习透彻。

什么时候算学习Lua毕业了?能独立开发一个Lua的单步调试IDE就行了。

友情提示:容易上手的东西精通都很难。我们现在对Lua的使用只是皮毛而已。

推荐资料:

《Lua程序设计》(lua基本语法,lua和C函数的互通)

Lua源代码 (Lua源代码的量非常小巧,但是密度很高,要一行一行的精读,调试)

LuaJIT源代码(Lua的JIT编译版本,可以和Lua源码比较阅读,精读)

tolua++源代码(开源Lua和C++绑定实现,精读)

云风的博客 blog.codingnow.com

云风 《Lua源码欣赏》


Java

为什么有Java,因为我们要在安卓平台开发,所以我们必须要熟悉Java。但是这里提到的Java是和安卓无关的,安卓是另一个我们需要熟悉的庞大主题。

学习的要点:

Java的语言特性及基础库(匿名类、容器、并发、异常、反射、文件处理、网络)。

Java的AOT和JIT两种编译方式。

Java的JVM虚拟机实现。

Java的GC实现机制。

推荐材料:

《Java编程思想》(《Thinking in Java》)

《深入理解Java虚拟机:JVM高级特性与最佳实践》

《深入Java虚拟机》(《 Inside the Java Virtual Machine》)

《Java SE 7虚拟机规范》

JVM源代码(代码量大,对学习操作系统和各种编译手段很有帮助,泛读)


Objective-C

IOS上开发需要使用Objective-C,是一门优雅的语言。同样,这里提到的Objective-C只是语言级别的东西,不涉及IOS。

学习的要点:

oc的语法和基础库(oc对象模型、函数调用、Interface、Category、Extension、selector、arc、容器、并发、异常、反射、文件处理、网络、NEXTSTEP贡献的设计模式)

推荐材料:

苹果官方开发文档

《Objective-C基础教程》(《Learn Objective-C on the Mac ForOS X and iOS》)


游戏的运行平台

目前我们涉及到的游戏运行平台有三个:

Windows

Android

Ios

所以要想更好的对我们的游戏做本地优化,我们必须熟悉各个平台操作系统。


Windows

学习要点:

Win32窗口程序开发。

MFC程序开发。

COM组件开发

ATL组件开发。

进程、线程、同步IO、异步IO、内存分配技术、API拦截和DLL注入、结构化异常。

内核、驱动编程。

推荐材料:

《深入浅出MFC》

《深入解析ATL 》(《 ATL Internals 》)

《 COM原理与应用》

《Windows核心编程》(《Windows via C/C++》)

《Windows驱动开发技术详解》

《Windows内核原理与实现 》

《天书夜谈-从汇编语言到Windows内核编程》

《寒江独钓——Windows内核安全编程》

WRK( Windows Research Kernel )源代码


Linux

不论Android或者IOS,它们使用的操作系统都是Linux的变体,所以熟悉Linux对学好Android和IOS是不可或缺的。

学习目标:就是操作系统必备的那一套,和Windows差不多,都摸熟了就可以了。(进程、调度、内存、中断异常、系统调用、信号、文件系统、同步和异步IO、驱动)

推荐材料:

《鸟叔的Linux私房菜》(入门教材,教你怎么操作,怎么使用命令的)

《UNIX 环境高级编程》(《Advanced Programming in the UNIXEnvironment》)

《Linux内核设计与实现》(《Linux Kernel Development》)

《深入理解Linux内核》 ( 《Understanding the Linux Kernel》)

《深入Linux内核架构》 ( 《Professional Linux KernelArchitecture》)

《Linux内核源代码情景分析》

《Linux设备驱动程序》 ( 《Linux Device Drivers》)

《精通Linux设备驱动程序开发》 ( 《Essential Linux Device Drivers》)

Linux源代码


Android

学习要点:

Android原生应用开发(组件、工具包使用、api等级、manifest配置)

NDK(这个实际上是Java提供的,只是我们只在安卓上面用,才放在这里)(JNI实现原理,NDK编译工具链和mk文件写法)

adb(adb工具使用,adb通信协议)

Android压包和解包工具

Android内核和驱动开发

Dalvik虚拟机

推荐材料:

《精通Android》(《Pro Android 4》)

《 Android应用性能优化》(《Pro Android Apps PerformanceOptimization》)

《 Android底层开发技术实战详解:内核、移植和驱动 》

《 Android系统源代码情景分析》

老罗的博客 blog.csdn.net/luoshengyang

Dalvik虚拟机源代码

NDK工具链源代码


IOS

和Android相比,并不推荐大家花很多的时间在IOS上面。个人觉得ios对技术人员来说是个挺没有意思的平台。

学习要点:

熟悉xcode。

熟悉UI组件和工具库。

熟悉ios私有api。

了解objective-c和c++互通的原理。

推荐材料:

官方文档(精读)

《精通iOS开发》(《Beginning iOS6 Development》)

没事可以找个刷机的源代码研究研究


模式

我们在写任何程序之前,一定要有一定的设计模式基础。不然写出来的代码会有各种毛病。

学习要点:

熟悉各种常用的设计模式,做到提到设计模式的名字就要想到对应的设计模式的意图、优缺点,以及对应的UML类图。

推荐材料:

GoF《设计模式-可复用面向对象软件的基础》

POSA 《面向模式的软件架构》 共5卷


游戏

游戏是最大也是最关键的主题。

笼统的讲,做出一款游戏,涉及到的东西应该有:

游戏资源管理、IO

游戏对象的管理和显示(渲染引擎)

物理

AI

网络

数据库

多线程

内存池


游戏资源管理、IO

IO主要和操作系统相关,有了前面的积淀,对我们来说应该不成问题。

游戏资源管理主要是指文件资源打包机制和补丁机制。

打包对提高游戏性能至关重要,重点要解决的问题就是怎样更合理地设计文件资源包格式、合理地设计高效索引提高查找和读取的效率。可以理解为我们自己定制的一个简单的小型数据库。

推荐材料:

暴雪MPQ文件打包源代码

https://github.com/ladislav-zezula/StormLib


渲染引擎

技术要点:

计算机图形学

3D引擎基本结构和设计

OpenGL

各种3D对象是如何组织和渲染的

GPU编程


计算机图形学

2D/3D渲染引擎的数学基础。

学习要点:

光栅算法、不同类型图元的填充算法、反走样算法、三维几何变换、三维观察变换、样条逼近算法、场景树、子场景组织算法、可见面判别算法、光照模型以及面绘制算法(材质、光线、阴影、凹凸、雾、透明混合、镜面映射)、后处理算法。

学习计算机图形学,最忌讳的也一样是眼高手低、不求甚解。什么才叫学会计算机图形学?每一个公式推导你都能自己做,那才叫学会了。

推荐材料:

赫恩《计算机图形学》

《Mathematics for 3D GameProgramming & Computer Graphics》

Mesa 3D源代码(Mesa是OpenGL的开源实现)

Kazmath(cocos2d-x所用的开源数学库)


3D引擎基本结构和设计

也许很多人会问这个不是框架架构层面的东西么?为什么不是从OpenGL写小Demo入手?

这个道理和我们需要扎实的理论基础是一样的。了解什么是3D引擎,我们就有了一个全局的概念。然后才能一一击破。

学习要点:

第一次看:了解3D引擎层次结构,了解一个典型的3D所必须要有的功能模块和它们的作用,了解模块之间的关联关系,了解渲染引擎在3D引擎中的位置地位。

第二次看:结合开源引擎,深入理解各个模块的实现和当前最新的研究成果。

第三次看:灵活应用,自己动手模仿写基础的3D引擎。

第四次看:结合自己的实践和大量参阅开源3D引擎,明白当前流行的3D引擎各自的有点和缺点。然后弃其糟粕,取其精华。

推荐材料:

《游戏引擎架构》(《Game Engine Architecture》)

《3D Game Engine Design》

《 3D游戏编程大师技巧》

《REALTIME RENDERING》


OpenGL

其实DirectX和OpenGL在一个对等的位置,对于学习而言,两者都一样。DirectX函数设计封装更为彻底、方便,OpenGL的函数则更加简洁、干净、适合学习。但是冲着跨平台的特性,以后大部分人估计都会直接学习OpenGL了。

OpenGL是搭建3D世界的工具,所以一定要非常非常熟悉。OpenGL里面涉及的一些学习要点以前培训过,大家可以自己回顾一下。

推荐材料:

红宝书 《OpenGL编程指南》(《OpenGL Programming Guide》)

蓝宝书《OpenGL超级宝典》(《OpenGL SuperBible》)

Nehe 的OpenGL教程 nehe.gamedev.net

Mesa 3D源代码


各种3D对象是如何组织和渲染的

这个有了图形学和OpenGL基础,自然就会明白了。所有的3D对象只是复杂度不同,组织方式不同,渲染的原理都是一样的。

学习要点:

常用3D模型格式、地形、树、植被、水、光晕、粒子、布告板、骨骼动画

推荐材料:

《Focus On 3D Terrain Programming》(3D地形)

《Advanced Animation with DirectX》(模型和动画)


GPU编程

GPU编程是3D开发很重要的一个环节。说到底就是Shader语言的应用。Shader可以上3D世界变得更加丰富多彩。很多绚丽的后处理效果都需要依靠Shader来实现。当然,最大限度的利用GPU的能力,已经是3D游戏突破性能瓶颈的最大利器。

相关的技术还有GPGPU(General Purpose GPU),即利用GPU的高速并行处理能力来去掉CPU多线程编程。

推荐材料:

《GPU 精粹》(《GPU Gems》)3卷

《Shadersfor Game Programmers and Artists》

《 Advanced Lighting And MaterialsWith Shaders》

AMD和NVIDIA官网

ACM Siggraph文献


物理

和游戏相关的物理主要有刚体力学、柔体力学以及流体力学。

推荐材料:

<<Game Physics>>

<<Game Physics EngineDevelopment>>

<<Real-time CollisionDetection>>

Box2D引擎源码

LiquidFun引擎源码

Bullet引擎源码


AI

人工智能是一个非常广泛的话题。对数学的要求较高,横跨好多学科。

学习要点:

基础的算法都应该有所了解,至少要知道个每个算法的实现原理和使用情景。

基于图和树的搜索(A*等)(*)

不确定性推理(贝叶斯网络、模糊逻辑等)

机器学习、模式识别(决策树、神经网络等)(*)

计算智能(蚁群算法、模拟退火算法等)(*)

自然语言处理(*)

有限状态机(*)

推荐材料:

《人工智能及其应用》

《高级人工智能》

《游戏开发中的人工智能 》


网络

网络最重要的是要掌握7层模型,掌握TCP模型,掌握Http协议。

学习要点:

搞清楚7层模型上各有哪些协议

TCP协议细节

Http协议细节

常见IO模型(阻塞IO、非阻塞IO、IO复用、信号驱动IO、异步IO)以及常见设计模式(最经典的是POSA中提出的reactor模式)

熟悉windows下的完成端口和linux下的epoll

熟悉游戏服务器中常见的几种网络架构

推荐材料:

《POSA -并发和联网对象》 第二卷

《C++网络编程》2卷 (关于ACE网络框架的好书)

ACE源代码

《TCP/IP》3卷(第一卷和第二卷较为经典)

《 UNIX网络编程》(《Unix Network Programming》)2卷

《Windows核心编程》

《Win32多线程程序设计》

MaNGOS源代码 github.com/mangos(魔兽世界服务器复刻项目源码)


数据库

学习要点:

表设计

SQL语法

SQL优化

存储过程使用

索引使用

数据库的几种锁的使用

熟悉数据库常见的几种存储引擎

推荐材料:

《Mysql必知必会》

《高性能MySQL 》

《深入理解Mysql核心技术》(剖析源码)

Mysql源代码


多线程、内存池

多线程主要是要熟悉windows的Thread和内核对象,Linux下的pthread。然后就是如何处理线程竞争,做好同步工作。

内存池没有专门的书籍介绍,大家可以到网上搜索基础算法。也可以看看Memcache的源代码。


游戏编程精粹1-7

这套书总共有7卷,以小专题形式讨论游戏的各个方面,推荐大家阅读,非常有帮助。


其他一个比较重要而艰深的主题是Debug,有时间也要研究透。