这两天给单位的技术做的一次学习材料推荐培训,直接ppt上拷过来的。
主讲人:臧旭
前言
今天提到的纯粹是我个人心得和理解,可能片面,可能以偏概全。
目的是给大家做一定的指引作用,想让大家知道自己还有哪些可以去学习,还有哪些不足,我们距离优秀还有多远。
对我今天提到的东西,如果大家有时间,一定要去深入了解,在技术的道路上才有可能看得远、走得稳、飞得高。
另外有一句对所有技术人员想说的话:
学无止境。切忌坐井观天、有一点小小的成就就沾沾自喜、止足不前。
扎实的基础
万丈高楼平地起,勿在浮沙建高楼。
有扎实的计算机理论基础:
1.对计算机知识体系有全局的理解。【广度】
2. 对任何一门技术都将有更深刻和透彻的理解。【深度】
数学基础
数学是基础中的基础。
不会数学推导,你就看不懂各种文献,也不会明白各种算法的个中所以。
不会数学推导,在3D道路上你更将寸步难行。
当然,你也可以选择让度娘给你一个别人写好的现成的。
但是,对内部原理和推导一窍不通我们就不能变通?网上找不到现成的怎么办?
积分和微分在任何数学场合都是基本功。
向量分析、矩阵分析。3D图形学中最重要的组成部分。
刚体力学、柔体力学、流体力学,游戏开发中非常常见。
数据结构的理论基础。
人工智能的理论工具。
计算机学科专业基础
计算机组成原理与体系结构
组成原理和体系结构可以合并在一起,也可以单独的拆分为两个科目。
两个科目相辅相成,各有重叠的部分。但是总体都讲述了计算机的各个硬件组成部分,各个部分的运作原理以及各个部分之间是如何互通协作的。
总体来说,两个科目都偏硬,但是组成原理偏硬更多,体系结构相比略偏软。
这个是基础中的基础,不学习这个,我们就不明白计算机到底是什么,也不会深入地理解计算机是怎么运作的。当然,我们肯定更不明白自己写的程序本质上到底是什么了。
推荐材料:
找一本高校教材就可以了,推荐清华大学出版社的
汇编语言程序设计
最低级的语言。
学习的目的:
推荐材料:
王爽 《汇编语言》
《C++反汇编与逆向分析技术揭秘》
《天书夜谈-从汇编语言到Windows内核编程》
《加密与解密》
操作系统
操作系统是大家很熟悉的名词。不言而喻,基础中的基础。
学习目的:
推荐材料:
恐龙书《操作系统概念》(《Operating System Concepts 》)
于渊 《自己动手写操作系统》
数据结构
不懂数据结构的程序员就不是一个程序员。
数据结构内容非常多,建议大家把每种基础类型的数据结构都仔细地学习一下,一定全部要自己动手写程序实现一遍,还要自己动手计算最好、最坏以及一般时间复杂度和空间复杂度。
对于数据结构的学习千万不能马虎,绝对不能眼高手低,能完整地没有bug地实现任何一个基础的数据结构都不是一件容易的事情。
除了基础的那些之外,一些常用的变种也很重要。值得花时间学习和实践。
推荐材料:
严蔚敏 《数据结构》
这里的程序设计算法,指的是六大基础算法。大家如果对ACM比赛有所了解,应该清楚通用计算机算法还有很多。但是对于我们平时遇到的问题,相信有这六大基础算法已经足够。
主要是:递归与分治、动态规划、贪心、回溯、分支界限、线性规划。
和学习数据结构一样,重要的是理解和动手实践。
推荐材料:
王晓东 《算法设计与分析》+《算法设计与实验题解》(推荐这个,后面两个太厚,讲的太多、太杂,而且《计算机程序设计艺术》三卷难度非常大)
《算法导论》
《计算机程序设计艺术》三卷
北大和浙大的ACM在线judge (无聊的时候做一两条稍有难度的题目也是非常有意思的)
和操作系统一样,所谓计算机网络基础,更加偏重的是理论,一层层地剖析七层网络协议,同时对各种类型的网络、物理媒介、网络拓扑、各种网络算法都有详细的描述。我们平时所关心的SOCKET、TCP、UDP之类的在整个计算机网络的知识体系中只是一滴水而已。
为什么要学习?
不学习这个,我们除了会用socket建立连接、发送消息、知道TCP有三次握手之类的之外,其他还知道什么呢?
所以再一次强调,学无止境,切忌坐井观天。
推荐材料:
潘爱民译《计算机网络》
《自顶向下网络设计》
数据库原理
数据库应该是一个很重要的学科。它的应用非常广泛。不要一想到数据库,就想到服务器开发人员用的。任何地方都可以使用数据库。
数据库原理主要描述的是关系模型、范式以及SQL规范。数据库原理是数据仓库、数据挖掘之类相关学科的理论基础。
建议大家学习使用任何的数据库之前,最好预先学习一下理论。不然建表和写SQL的时候会出现很多不合理的地方。
另外,对于数据库来说,自己动手写一个小型DBMS(数据库管理系统)的收获是最大的。因为实现一个DBMS涉及到的知识点太多了,需要丰富的编译原理、数据结构、操作系统知识。是一个把知识融会贯通的好机会。
推荐材料:
没什么特别优秀的理论书
一定要自己动手实现一个DBMS
编译原理
编译原理,当然讲的最多的是和编译器相关的原理知识。
为什么要学习:
推荐材料:
龙书 《编译原理》
《加载器和链接器》
《程序员的自我修养:加载、链接和库》
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,有时间也要研究透。
原文地址:http://blog.csdn.net/sharemyfree/article/details/26007601