在面试一个游戏编程职位前,你需要知道的东西

来源:互联网 发布:debian 软件源 编辑:程序博客网 时间:2024/03/29 01:12

转载自 心想事成 2010年08月17日 22:07 阅读(8) 评论(0) 分类:个人日记 权限: 公开

很长时间以来,游戏产业不允许新的血液加入,因为每个职位都要求申请人有2年以上的经验. 但是现在是加入游戏产业的最好的时机. 因为研发队伍的急剧增长, 有经验的人很难找了, 所以越来越多的公司从大学里招人. 不管你上的是什么大学,你都有机会在游戏产业里找到一份工作. 你需要熟悉以下领域. ­

    数学 - 对于视频游戏开发,这个非常重要. 不,你不需要去记如何求一个绕x轴旋转的曲面的表面积. 你需要有很好的线性代数技能. 如果你不知道点乘的公式(a dot b = a.x * b.x + a.y * b.y + a.z *b.z )和它的几何意义(|a| *|b| * a和b夹角的余弦), 你是不可能获得工作的. 你需要知道如何把一个向量投影到另一个向量上(a到 b的投影 = (a dotb)/|b|^2* b) 以及一个平面上. 你需要知道向量积(叉乘)是什么(a x b = [a.y *b.z – a.z * b.y, a.z * b.x – a.x * b.z, a.x * b.y – a.y * b.x]),以及它的几何意义(一个和两个向量都垂直的向量,长度等于原来两向量的长度乘以两向量的夹角的正弦). 我记忆向量积公式的方法是把i,j,k 放在矩阵的第一行,然后是第一个向量,最后一行是第二个向量, 然后计算这个行列式. 如果你不知道什么是行列式或者如何计算一个行列式, 这可不是个好的信号! 你应该知道一个矩阵的逆以及如何计算,你应该知道如何转置一个矩阵. 你应该知道什么是正交矩阵以及求它的逆的简单方法(求它的转置就行了). 熟悉各种坐标空间之间的转换是很重要的. 碰撞检测函数背后的数学原理也很需要学习. 你如何找到一条光线和另一条光线的碰撞点?一个平面呢?一个球面呢? 什么是四元数(quaternions)? 你如何对它们做一些常见的操作? 如果你的数学已经不那么熟了或者不知道如何开始, 我推荐 "3D Math Primer for Graphicsand Game Development".我读过以后发现它很好地覆盖了所有的基础知识. 我没有读过别的书来做比较, 但是这本书肯定会给你打下很好地基础,同时它也是很多游戏开发中常见数学运算的参考资料. ­

   物理 - 你需要对各种抛物体的公式非常熟悉.如果你不能记住或推导出d = v0 * t + 0.5 * a * t^2, 你肯定会在面试或编程测试中遇上麻烦. 你应该能轻松解决任何涉及到抛物体和重力的问题.不论未知量是重力加速度, 发射角, y方向速度, xz方向速度, 时间,距离, 或其他任何可解的组合,你应该能没有任何困难的求出解来.你应该熟悉弹性和非弹性碰撞下的动量和动能变化. 滑动和摩擦力也是你应该理解的概念. ­

    C++ - 虽然一些地方还在用c多过c++,但是C++已经是游戏编程中向被广泛接受的几乎标准的语言. C++的知识是非常重要的.因为如果用的不好, 你会写出非常糟糕的代码.首先,你应该知道什么是虚函数,以及如何使用它. 理解虚函数表是如何工作的也同样重要,这样你就能够理解当你调用虚函数时需要的额外步骤,这些步骤会降低性能(每个对象都有一个隐藏的虚函数表指针[具体在哪取决于编译,并且对指针做类型转换时,this会有变化],这样调用一个虚函数,你需要根据这个指针找到那个函数表,然后跳到它所包含的函数指针所指的函数里,这会降低cache的效果). 知道如何有效地使用模板和操作符重载也很重要. 关于C++,好的OO设计是最重要的. 最常用的一些类层次很深而且很费解,你最后需要做可怕的虚拟继承或者为一些不需要的变量浪费内存. ­

    人工智能 - 我在大学里学习了标准的人工智能课程,但是这些东西没有一点在游戏AI中是可接受的. 教的很多算法很难实现或者对游戏而言不现实. 你知道什么是有穷状态机就够了. 绝大部分游戏使用有穷状态机, 而那些不用这个的游戏,使用的是简单的基于规则的系统. "白与黑"(包括它的续集)是我能想到的唯一的使用了其他东西(神经网络)的例外, 而且很多玩家对它的结果并不满意. 如果你想找本书, 我推荐"AI Game Programming Wisdom 3". 里面有两篇特别优秀的文章,一个是关于有趣的游戏AI设计,另一个是关于行为合成. 严肃的说,虽然书会很有帮助,但是学习游戏AI的最好的方法是实际做一个. ­

   图形学 - 这是一个重要的领域. 如果图形是你的主要感兴趣的方向,那么你应该知道的比这里说的多.但是,不论你想要在这个产业里做什么职位, 你应该知道一些基础. 你需要知道什么是渲染状态以及通常都有哪些渲染状态?(cull, z write, ztest之类的).什么是标准的光照方程?(I =ka*Ia + Ii*(kd*(L dot N) + ks*(R dot V)^n) ). 材质映射是如何工作的?材质的wrapping和clamping有什么区别? 如何高效的渲染程序中一组几何体?(按照渲染状态组织你的几何体,按照你的硬件最快的primitive分批,饭后发给图形卡).你需要知道 skinning 是如何工作的. 如果你对书感兴趣, 我推荐 "3D Computer Graphics". 这个不是专为游戏写的,多以它包括了一些在游戏中不现实的技术.但是,我想一个总体的了解是有帮助的,而且,随着游戏硬件的发展, 那些现在看来不现实的技术会变的普通的. ­

    工具开发 - C# 看来在游戏业界获得了不少地位.所以你也应该让你熟悉一下C#.C#在加快工具的开发上表现出不少优势.很多人说工具可以制造下一代的游戏, 我同意这一点. 拥有的工具越多,团队花在可以被轻易自动化的工作上的时间就越少. 可能你的团队有10个美工, 花程序员的一个人年来开发一个可以给美工每天省15分钟的工具并不值得,但是如果你有50个美工,那这就肯定值得了.C#可以快速的创建GUI,而且和其他一些能简化创建GUI的方法不同, 这些GUI很好理解和使用,因为他们是标准的windows组件,允许你方便的设定快捷键,就像其他Windows程序一样. Visual Studio 里的Form Designer 真的很好用,而且C#的metadata和event驱动的设计使得工具的开发轻而易举.你最好也对mfc有基本的了解,因为可能面试你的开发人员会有点落后与时代.如果你有兴趣学习很多关于这些技术是如何工作的(这会让你写出更好的C#代码),我强烈推荐"Applied Microsoft .NET Framework Programming",我在空闲的时候读这本书,然后我就不能放下了.我一章一章不停的读,因为我是那么激动的像学习下一章的话题了.记住, 这本书不会教你各种framework里的类和这些类是干嘛的.它讲的是这个语言的核心机制,它是如何工作的. 这本书也不是专门为C#写的. 它告诉了你如何用VB.net做一些在C#里不能做的是,它还提供了用MSIL(MicrosoftIntermediate Language, 所有.net语言的编译器都会编译出这种字节码)写的例子,实现一些不被任何一种.net语言支持的功能. ­

   操作系统 - 虽然这个看起来和这个和游戏开发相对而言不是太相关, 但是我很高兴我在大学学习了操作系统的课程,因为我经常会用到从这门课学到的知识. 关于操作系统的知识非常重要,因为它在幕后为程序处理着很多重要的工作.特别是由于下一代的游戏终端和双核PC上的多核特性,多此案成的知识是至关重要的.对虚拟内存的了解当然是很有用的.关于文件系统,内核态和用户态切换,分页的知识对PC游戏开发更为有用, 不过随着一代代的发展,终端也在变的越来越像PC.所以,知道这些东西没有坏处. ­

  编译器 - 虽然知道如何写一个分析器可能并不重要, 但重要的是知道你的代码是如何编程汇编代码的.这样你就能明白如何写出更优化的代码.你显然必须熟悉把你写的程序变为可执行文件的4个步骤:预处理、编译、汇编和链接. 编译器如何处理常量的? 很好的理解宏和知道如何用它来简化一些常用的操作是很重要的. 知道你正在用的编译器的调用约定,因为参数超过一定数目的时候,会导致它们被放在栈上而不是在预留的寄存器里. 调用约定的知识在你用汇编写函数的时候也是有用的. ­

­

     这些只是一个作为一个游戏程序员,你应该具备的各种知识和技能的入门介绍. 对每个领域,根据你的工作类型,总会有更多的你需要学习的东西. 知道一些实际使用的知识之外的东西总是没有坏处的. ­

­

如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高原期,迫切需要从理论上提高,那么计算机学院是唯一选择。因为计算机学院才能让你在理论上更上一层楼。软件学院从教学计划上就没有把你往这方面带。当然能不能更上一层楼最终还是完全取决于你自己。需要特别说明的是,工作经验并不一定等于开发经验,我见过很多工作2-3年的人,但是没有一点开发经验。 ­  ­

  你说:“他们都有很强的开发能力,只是不太喜欢读书,也只是希望混个学历对今后在岗位上晋升有好处”,我可以向你保证,你所说的人绝对不是开发能力很强的人。因为,1)高手不可能不喜欢读书;2)高手不可能想去混一个学历;3)高手不可能认为晋升是因为学历的原因。 ­

   ­

  还需要说明的是,考计算机的人未必个个都是高手,严格来说,大部分都不会编程序。也就是说,庸庸碌碌之辈仍然占绝大多数。研究生毕业的师兄只拿2500元左右的比比皆是,所以不要寄希望于拿一张研究生文凭出去赚高薪。但是,对于有实际开发工作经验的人,要想自己在3年之中有一个真正的提高的话,计算机学院提供了广阔的平台。就我所知,每一个月拿2万以上的也有(上海育碧,图形特效算法设计)。所以,同为研究生毕业,能力的差距是极大的。所以,不要去问“研究生毕业能拿多少?”,要问“像我这种水平的人,研究生毕业能拿多少钱?”这样人家才能够准确地回答你。 ­

  所谓“有实际开发工作经验”是指你目前已经具备下列能力: ­

1)你已经认为C++和汇编语言都是很简单的语言,并能够自如地运用; ­

2)你能够在30分钟之内想到正确的五子棋AI算法设计思路和方向; ­

3)你完全理解STL为什么这么重要; ­

4)你能够独立地解决所有的编译与链接问题,哪怕你从来没有遇到的问题,你也不需要询问任何人; ­

5)英文网站是你的首要信息来源; ­

6)能够读懂英语写成的国际标准,比如NTFS磁盘格式标准。 ­

7)你经常站在集合论的角度思考算法问题; ­

8)能够理解一个简单的驱动程序,能够理解一个简单3D交互程序;

9)你能够认识到线性代数和概率论在实际编程工作中的极端重要性; ­

10)你完全理解COM的设计思想,尤其能够理解COM为什么要设计成这样; ­

11)当我说到虚函数的重要作用时,你不会急着去找书来翻; ­

12)你能够说出C++为什么比其他语言优秀的理由,记住这种理由应该来自于你的开发体会,而不是因为其他人都这么说。

  此外还有很多判断标准,但如果你同时具备5条以上,可以认为你已经具备相应的开发经验了。在这种状态下读研,你将取得读研效益的最大值。 ­

  读研最重要的是要明白你自己要干什么,不能等导师来告诉你你应该干什么。研究生的优势在于理论功底深厚,思维具有穿透力,当然编程能力首先要过关,不要读完研究生还不知道MFC程序的WinMain函数在哪里。所以,研究生期间,你一定要做有理论深度的算法设计,比如大规模数据的搜索算法,性能是首要考虑因素,不要奢望SQL函数能够帮你解决问题,所有的问题你都必须自己解决,你必须解决内外存交换的性能瓶颈。再比如极品飞车的3D场景生成,图形变换,碰撞检测,物性模拟,纹理映射,灯光模型等等,这些都是可以保证你能拿到2万以上月薪的技术。如果你认为这些东西太难,不可能做得出来的话,那么你就不适合读研。真的,要是你认为读研之后还是要去搞一般的程序设计,如信息管理系统之类的软件,那么你读研的价值就完全不会得到体现,因为这些工作根本就不需要读研。 ­

  软件学院宣称培养软件开发人才,恕我直言,我从来没有看见那个高手是培训成功的。成为软件开发高手的路只有一条:自学!软件开发中需要大量的编程实践和独立思考,只有在此过程中,你才能够逐步成长起来。软件学院宣称培养软件项目经理,这更是搞笑,在某种意义上这是欺骗行为。学院里面能够培养出软件开发经理更是十足的谎言,软件项目经理必须,或者说更强调从战争中学会战争。没有实践经验的项目经理就是绣花枕头一个。 ­

  实话实说,软件学院就是一个蒙钱的机构,公关工作做得很好,善于打广告,而且都是打着高薪的幌子,就如同外面的什么北大青鸟培训班一样。两个字:蒙钱!四个字:还是蒙钱! ­

   ­

  总之一句话,如果你只想成为软件开发高手(比如认为会编驱动程序或杀毒软件就是高手的那种),建议工作,不要考研;完全没有工作经验的,也不建议考研,你进来了只有瞎混一通。如果你有上述工作经验且想成为高级软件工程师(能够独立理解并设计出快速傅立叶变换算法的那种软件工程师)的话,那么强烈建议考研。考研让你有3年放松思考的机会,也有3年让你思想和技术积累沉淀的机会。非常难得的机会。不考研的话,这种机会就是一种奢侈,可望而不可即的那么一种奢侈。 ­ ­

  所以,不管你是哪一种情况,都不建议考软件学院。除非你是女生,把能够成为一个研究生当着一生最大满足的那种女生。 ­

  1)关于读书的机会成本问题。读研的机会成本的确是很高。任何人都可以简单地计算出来。所以,我也不赞成所有的人都去读研。读研只适合那些痛感数学在编程中的极端重要性的人。如果对理论工具和理论思维的极端重要性没有切肤的认识,那么读研的价值几乎为0;读研的好处在于:A,把你自己放在一个学术和工程的交叉点上;B,让你具备了进入微软等世界顶级软件研发机构的可能性;记住只是可能性。但是不读研这种可能性为0;C,如前所述,如果没有读研的机会,你也就没有静下心来好好钻研几年理论的机会;一边工作拿高薪,一边深入地学习各种理论,诸位认为这可能吗?我反正认为不可能,我觉得学习钻研理论最需要的就是一个长期安静独处的环境,一边工作一边读书是不可能有这样的环境的,你会觉得每天都在疲于奔命。而读研正好可以提供这样一个环境。我同时还反对整天跟着导师的屁股后面跑,这样会浪费很多时间。读计算机的研究生,主要依靠自己去查阅最新文献,自己去研读文献,和导师的口头交流一个月一次就足够了,前提还需要导师的水平足够牛。如果导师的水平不牛,这也没关系,不理他就是了,自己做好自己的事情即可。 ­

   ­

  2)关于研究生教学质量问题。坦白地说,全国都是“洪桐县中无好人”,尤其在计算科学领域,大牛极少。那为什么还要去读研?大哉问!把读研的收获寄托在名校或名师的名我认为气上,是注定要失败的。读研全靠自学,研究生之间的差距全部体现在自学能力上面。又有人问,既然是自学,为什么非要读研?回答是:因为读研就是为你买一份保险,就是买一份你自学三年之后不会失业的保险。这份保险主要是一种心理上的后盾,让你在自学过程中经得起诱惑,能够从容镇定地去追寻计算机理论发展的坚实足迹,从欧拉,费马,高斯,康托,图灵等巨匠那里寻找方法论的珠宝。倘若没有这份保证,你在家里面自学3个月,保证你会被失业的压力压得喘不过气来,何谈安心学习? ­­

  3)关于实战经验与理论学习的优劣问题。这没有定论,如前所述,管理信息系统,设备驱动开发,工具软件开发,软件病毒剖析等等这些工作不太需要创造性,需要的是耐心和经验,需要的是对既有规范的准确理解,这类开发工作最适合在实战中提高,理论学习没什么作用。但是在人工智能,模式识别,图像压缩,虚拟现实,巨量数据检索,自然语言理解,计算机图形学等等领域,理论学习就占据着绝对的统治地位!这些领域的突破对人类的生活的影响是极其巨大而深刻的。某些领域处于一个极其快速发展的态势之中,比如计算机图形学,相信诸君能够从众多3D游戏的灿烂辉煌中体认到我的这种说法。在这些领域,如果没有扎实的理论功底,一切都是那么遥远,不管你花了多少时间在编程上面。 ­

   ­

  4)关于高级研发人员的知识结构问题。首先声明,我不是一个纯粹理论激进分子,即认为除了理论之外,一切都不重要。我认为,纯熟的编程技能是最基本但也是最必不可少的技能。没有这个基础,一切计算机理论就是空谈(研究图灵可计算性理论的研究者除外)。有了这个基础之后,下列理论学习方向必须重点突破: ­

  1,科学哲学。这是核心中的核心!可惜国内不开这门课。不但不开课,而且还作为批判对象来引用,实在是遗憾至极!这是一门教你如何“钓鱼”的学科,在一切科学研究中居于最核心的地位。它是古今科研方法和思维方法的集大成者,很难想象一个成熟的研究者没有一套自己的方法论体系。科学哲学最需要的是领会与总结,它的思想与启示会伴随我们的一生。 ­

   ­

  2,康托集合论,矩阵方法,离散结构,图论方法,群论方法之间的紧密关系。最重要的认识这些理论对实践的重要启示和方法引导。我始终认为,如果你学了一门理论之后,却不知道这门理论有什么作用,那么你的理论就白学了,你什么东西都没有捞着。所以,学习任何理论之前,先问自己:它有什么用?在哪里用?如何用?带着这些问题去学习理论,你才会真正地学到东西。用这三个问题去问你的理论课老师,他的回答就是判断其实际水平的最佳标准。 ­ ­

  3,思维要有极强的穿透力,学会看透文献作者没有写出来的动机。绝大部分大师都有隐瞒自己最具有方法论启示意义的思考环节的习惯。牛顿和华罗庚先生都有这个坏习惯。这让大家认为他们是天才,因为很多问题他想到了,我们想不到。但是为什么他们能想到,我们想不到?他们是怎样想到的?没有人告诉我们牛顿发现万有引力定律时的思考过程,当然,牛顿可以慷慨地把他的思考结果告诉我们,但是,他那可以点石成金的“金手指”却没有教给我们。我们的任务就是要培养透过文章看穿作者背后意图和动机的能力,在这方面,台湾的侯捷和美国的Donbox是绝佳典范。这两只老狐狸(呵呵,是爱称)凭着其猎犬一般的嗅觉,抽丝剥茧,一个把COM背后的幕后设计动机揭开并暴露到了光天化日之下,另一个把MFC的宏观架构做了一次完美的外科手术。其非凡的思维穿透力令人惊叹。    ­

  4,英语。英语本身不重要,但是用英语写成的文献就极其重要了。所以,专门把英语作为一个重头戏列出来。大家不要相信英语无用论的鬼话。对于搞计算机的而言,英语就是你的母语! ­  ­

  5,其它的具体理论还有很多,但是都不如这三个方面重要,因为我觉得这三个方面是最具有根本性,全局性的能力培养环节。需要指出的是,很多高深理论对你的工作是无意义的,当心时间陷进去。一定要把效率最高的时间段用在最具有决定性意义的理论学习上。 ­

  5)关于读研之后的出路是否光明的问题。我们应该承认,读研之后,你的工作机会不是变多了,而是变少了。而且越是高手,他的工作机会和工作范围就越少。这是因为,越是搞前沿研发的公司,其数量越少,在这个圈子的人也就越少。你找工作的范围就越小,试问:如果微软的OS设计专家出来找工作,能够让他选择的公司能有几家?但是,这种公司数量的减少是以工资待遇的急剧上升为补偿的,同时,你在工作中所受到的充分尊重也是在一般公司中体会不到的。所以不要担心学了高科技用不上,呵呵,你只会越来越感觉自己学的不够用。相信接到过猎头公司电话的人会体会得到。真正的高手从来就不会担心工作的问题,也从来不会到人才市场上去找工作。既然选择了理论深入,那么就应该把眼光放得更远。 ­

     如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高原期,迫切需要从理论上提高,那么计算机学院是唯一选择。因为计算机学院才能让你在理论上更上一层楼。软件学院从教学计划上就没有把你往这方面带。当然能不能更上一层楼最终还是完全取决于你自己。需要特别说明的是,工作经验并不一定等于开发经验,我见过很多工作2-3年的人,但是没有一点开发经验。   ­

1、C++primer中文版第4版
2、C++标准程序库自修教程与参考手册
3、Windows程序设计第5版
4、MFC windows程序设计第2版中文版
5、VC++深入详解
6、MFC深入浅出
7、Effictive STL
8、Windows核心编程
学好以上几本,也可以去游戏公司一试VC++软件工程师职位了。
9、WINDOWS游戏编程大师技巧第2版
10、3D游戏编程大师技巧
11、DirectX角色扮演游戏编程
12、DirectX特效游戏程序设计
13、精通DirectX 3D图形与动画程序设计
14、DirectX高级动画制作
15、Ogre引擎研究
16、游戏人工智能编程案例精粹
17、Visual C++实践与提高--网络编程篇
18、C++网络编程,卷1
19、C++网络编程,卷2
20、Visual C++网络游戏建模与实现第2版
21、代码优化:有效使用内存

原创粉丝点击