首页 > 游戏引擎

游戏引擎开发的学习路线

很多游戏幵发者认为自己能写逻辑就等于掌握了游戏开发技术,引擎对自己来说无足轻重,这种想法是有问题的。

首先你写逻辑是在引擎的基础上写的,其次如果你对引擎一无所知,非常不利于你去深入理解逻辑开发。相反,如果你对引擎有深入的研究,你调用引擎提供的接口时可以很清楚地知道其内部是如何实现的,这样有助于写一些引擎的辅助功能算法,提升自己的编程能力。

我以前在 xxx 公司工作时,项目组就有一位逻辑程序员在做功能时,需要在原有引擎接口的基础上增加一些算法编程以满足游戏玩法,当时他并没有求助引擎组的同事,而是自己写出来了,因为他自己平时就喜欢钻研 3D 游戏引擎,了解引擎接口内部是如何实现的,这本身就证明了他的编程能力。最后将其吸纳到拥有公司最核心技术的引擎项目组,薪酬和职位同时得到了提升。

因为在公司里面会写算法,或者会 GPU 编程的人相对来说非常少,如果你掌握了 3D 引擎开发技术,不仅对于逻辑开发更加有利,而且对于你技能提升帮助非常大。

学习 3D 引擎需要经历一个由浅入深的过程,首先要了解最基本的一些 3D 知识,比如固定流水线、可编程流水线、3D 模型结构、骨骼动画等,并且能利用 Dirct3D 或 OPENGL 或 OPENGLES 这些图形库中任何一个,做个简单的 Demo。

通过这个 Demo 了解程序运行的原理后,再尝试封装一些简单算法,一些常用函数,利用这个简单封装做一款小的游戏 Demo。

最后再研究一下 GPU 编程,比如 CG、HLSL 语言的语法,在 GPU 编程的基础上再学习一些大型游戏开发中常用的算法,比如 PSSM 实时阴影算法、Bloom 算法等,它们都是与 Shader 编程紧密相关的后处理渲染算法。

目前各大游戏公司,比如网易、腾讯、EA、任天堂等国内外知名的 IT 公司,还有许多新兴的 VR/AR 公司非常紧缺 3D 引擎资深程序或者图形学引擎开发人员,开出了非常诱人的薪水和待遇,从中可以看出,目前游戏市场对于这类人才需求还是非常紧缺的。这正是一个学习 3D 引擎幵发的好机会,俗话说“机不可失,时不我待”。

我曾经在国内知名 IT 游戏公司参与过 3D 游戏引擎项目组的研发,利用业余时间也开发过3D游戏引擎,从底层算法到架构设计都是一个人完成的,当然开发周期也是比较长的。

如何学习 3D 引擎开发?

回到正题,3D 引擎这么重要,那作为新手应该如何着手学习?换句话说,关于幵发 3D 引擎要具备哪些条件?网络上有许多这方面的解答,我经过多年对 3D 游戏引擎的开发研究和实践经验,在此主要总结了以下六点供大家学习参考。

1) 首先必须掌握主流幵发语言C语言、C++JavaC# 至少一门编程语言。

2) 编程离不开数据结构,大学课程里面学的数据结构对于游戏开发非常重要,数据结构在游戏开发中主要用于数据存储及内存管理,开发 3D 引擎常用数据结构有数组、链表、哈希表等,以及常用的一些查找算法:快速排序、二叉树查找、二分査找等,对于常用的数据结构要重点掌握。

为引起读者重视,在此再重点强调一下,数据结构对于游戏开发非常重要。

3) 线性代数对于开发同样非常重要,掌握线性代数的目的是在游戏开发中灵活地运用向量、矩阵、四元数,以及欧拉角这些基本的数学运算解决问题。3D 固定流水线中的坐标变换和可编程流水线的顶点和像素转换都是使用线性代数运算完成的,运算主要涉及游戏幵发中的物体移动、旋转、缩放,以及点乘和差乘等。

4) 现在的 3D 游戏引擎渲染都是基于 DirectX 或者 OPENGL、OPENGLES 这些图形库完成的,这就需要开发者能够熟练地使用图形库的接口开发程序。在当前移动端跨平台非常火热的情况下,建议大家学习 OPENGL 图形库。

3D 引擎的核心功能就是对游戏的场景渲染和物体的材质渲染。

对于材质中有 Alpha 通道的要做特殊处理,Alpha 通道就是说材质有透明的部分。在移动端为了减少透明材质的消耗,会通过 GPU 编程在 Shader 中进行处理,比如把有 Alpha 通道的图片切分成无 Alpha 通道和有 Alpha 通道的图片,通过 Shader 编程将其再合在一起。

场景渲染使用的是后处理渲染效果,比如 Bloom、Blur、 Ssao、Pssm 等。这些效果实现与 GPU 编程息息相关,要求大家至少掌握 GLSL、HLSL 或 CG 这些基于显卡 GPU 编程语言的一种。

5) 学习图形学算法,游戏要实现一些逼真的效果离不开算法的支持,比如柔体的模拟、刚体碰撞效果及曲线插值算法等。

学习图形学算法,建议大家看一下《算法导论》这本非常经典的书籍,以上说的这些是引擎中比较深层次的知识点。

6) 另外,在框架设计方面,需要掌握设计模式里常用的如工厂模式、单件模式、状态模式、MVC模式等。设计模式的使用不能靠死记硬背,需要将其灵活运用到项目幵发中,这样才能逐步深入领会其设计精髄。

初学者在使用设计模式的过程中会出现一个误区:千万不要为了使用设计模式而使用设计模式,过度使用会得到适得其反的效果,凡事要把握一个度。以前公司的同事为了使用设计模式,不论设计什么模块都要用设计模式,最后导致在模块扩充时出现了很多问题,举这个例子的目的是告诉读者好东西也不能乱用。

我从没有在做架构设计时去特意考虑用哪种设计模式,都是顺其自然地使用,真正的用剑高手,可以做到手中无剑,心中有剑的境界。

以上六点是笔者对 3D 游戏引擎开发的心得体会,建议大家循序渐进、由易到难地学习。

再谈算法

游戏开发最核心的技术是算法,在游戏开发中占非常大的比重,也可以说是引擎核心中的核心,以笔者亲身开发项目经历给大家分享一下,希望起到抛砖引玉的效果。

近期与高校科研机构合作研发了一款海水渲染 3D 引擎,可以逼真地模拟真实海浪,以及海浪在不同的天气实现不同的效果,模拟船在海中随海浪上下浮动和直升机在海浪上空悬停风力与海浪的作用效果等。

在实现的过程中使用了很多算法,比如 Perlin 噪声算法、弗洛伊德算法,以及物理算法等。

如下图所示,是基于 GPU 编程模拟的旋涡。
旋涡模拟
图1:旋涡模拟

总结

技术的掌握不是一朝一夕能够完成的,关键在于坚持,首先要做的是打好基础,在真正掌握了基础知识后,再提升是非常快的。

做游戏引擎也是知识积累的过程,虽然现在的 3D 引擎非常多,自己幵发游戏引擎己经不现实,但要想真正地深入学习游戏幵发核心技术,至少应该知道引擎的底层是如何实现的,换句话说就是其工作原理要搞清楚,这对于开发者来说非常重要。

不要再把自己局限于代码操作工简单地写写逻辑,这对自己的技术提升没有任何帮助的。要做到对游戏开发知其然知其所以然,就必须学习 3D 引擎开发技术,特别是对刚踏入游戏行业的从业者,每天坚持不断地学习,如果能持续不断地学习 10000 小时,你肯定会成为 3D 引擎高手。

这就跟锻炼身体一样,其实锻炼身体非常能够磨炼一个人的心性,锻炼一个人的意志力。

自己尝试开发一款小的游戏引擎,即使不能成功,但过程也是非常重要的,你从中可以学习到很多知识,经验的积累对自己的发展帮助非常大,这也是为什么游戏公司招聘,首要的条件是应聘者要有实际开发项目工作经验。 

所有教程

优秀文章