收藏数远超点赞数,这是为什么 ( ̄□ ̄;)


该系列文章主要面向完全没有引擎基础,但具备一定编程基础的同学。讲解的内容不会展开太深入,只希望读者可以对游戏引擎中的技术有一个基本的理解。如果大家对其中的某些内容感兴趣,可以评论留言。我会根据大家的期望,力所能及地展开讲解。

简介

电子游戏是一款软实时(soft real-time)模拟软件。软实时模拟软件需要做到可以响应实时操作,并且即使由于某些原因没有立即响应也不会造成灾难性后果。在电子游戏这样的软实时模拟软件中的大部分数学问题没有闭合式解,因此需要进行离散的模拟才能得到一个结果。

游戏引擎正是为了完成游戏中各种各样的模拟而整合了各种各样的模块,例如物理模块、渲染模块、逻辑模块等。早期的游戏引擎大多只能运行在特定平台,例如《雷神之锤》的引擎Quake engine、魔兽世界用的暴雪自家引擎。

Quake
魔兽世界

后来出现了可以跨平台运行的通用游戏引擎,例如Unity、Unreal。

Unityhttps://www.zhihu.com/video/1424822302597406720Unrealhttps://www.zhihu.com/video/1424822347957837824

一般来说,越通用的游戏引擎,在特定平台上的运行效率会越不如那些只能运行于特定游戏平台的游戏引擎。因为性能优化总是基于特定假设的,这个假设越单一,优化起来会越轻松。

上图中,游戏专用子系统第三方软件开发包之间的内容都属于游戏引擎的内容。

硬件

硬件是运行游戏的物理设备,例如pc、xBox Series X、PS5、ns。

PC
xBox Series X
PS5
NS

驱动

驱动是负责和硬件进行通信的底层软件,常见的驱动有显卡驱动(Nvidia、AMD)、声卡驱动。有了这些驱动之后,开发人员就不需要为具体的硬件设备编写代码。驱动很好地隐藏了硬件设备的复杂性,使开发工作的复杂度降低。

操作系统

在操作系统层面上,大致上可以分成游戏专用操作系统非游戏专用操作系统

游戏专用操作系统有xbox的XBoxOS、ps4的Orbis OS、ns的Horizon。这些操作系统的通常知识一个轻量级的库,在游戏运行时,游戏程序几乎可以占有硬件的所有资源和控制权,所以游戏运行效率很高。

而非游戏专用操作系统通常都会因为各种各样的原因只能占用硬件的部分资源和控制权,例如windows操作系统采用基于时间片(time-slice)的抢占式多任务(preemptive multitasking)方式来运行所有程序。

这也是为什么同一款游戏在同样硬件性能的PC和PS3上面运行,PC上可能直接变成PPT,而PS3却可以30帧稳定运行。

xbox的XBoxOS
ps4的Orbis OS
ns的Horizon

软件开发包(SDK)

软件开发包一批功能良好的函数的集合,这些函数又称为称为API(application programming interface)。

大部分游戏引擎都会接入第三方SDK以增强引擎的功能,通过接入SDK的方式给引擎增加功能可以减少引擎的研发压力,同时又能获得良好的效果表现。

下面列举一些比较常见的第三方SDK:

物理引擎有Havok、PhysX、Bullet等。

动画引擎有Havok Animation、Granny等。

Havok Animation可以在运行时给动画加上物理效果,也就是物理动画技术(Physically based animation)。

动画的制作流程比较复杂繁琐,部分有钱的游戏厂商会通过动捕(motion cap)的方式来制作动画,钱包确实顶不住的话可以使用Endorphin来自动生成帧动画,提高生产效率。还有一种减少工作量的方法,使用Euphoria在游戏运行时生成符合物理和生物力学的动画。

平台独立层

平台独立层会为特定模块封装各个平台的底层API,让游戏引擎可以支持在多个平台上运行。这一层算是游戏引擎和外界环境进行沟通的桥梁。

核心系统

核心系统会为游戏引擎提供一个软件该有的底层功能,所有类型的软件都会有这一层。

这一层的内容也不少,我们关注得比较多的是内容管理模块。因为游戏引擎往往都需要保证最多每隔32毫秒就要执行一边全体代码,对于内存的管理要求会比较高,需要实现高效地内存分配和释放,还会自定义数据结构及算法来减少或完全消除动态内存的分配。

渲染引擎

渲染这一块内容就比较丰富了,已经被独立成一个专业学科--计算机图形学。一般游戏引擎都不会去开发自己的渲染引擎,因为投入产出比太低,而且现有的渲染引擎已经很成熟了。所以游戏引擎一般都会接入已有的渲染引擎。

常见的渲染引擎有DirectX、OpenGL、Vulkan、Edge等。这里的Edge并不是指微软的Edge浏览器,而是专门为PS3渲染设计的,拥有高效几何处理技术的渲染引擎,同时它还具有动画播放功能。

渲染引擎一般会采用分层架构(layered architecture)来组织代码,一般会被分为低阶渲染器(low-level renderer)场景图(scene graph)/剔除优化视觉效果前端

低阶渲染器会使用图形SDK来设置好渲染器,实现几何图元(geometric primitive)的高速渲染。

场景图/优化剔除会为不同的游戏场景提供不同的算法来限制提交到GPU的图元数量。常用的算法有平截头体剔除(frustum cull)、空间细分(spatial subdivision)、portal、遮挡剔除技术。其中空间细分算法可以使用不同的数据结构来构建场景图以快速判别潜在可见集(potentially visible set, PVS)。

视觉效果层专门提供丰富的视觉效果,其中包括粒子系统(particle system)、贴花系统(decal system)、光照贴图(light mapping)、环境贴图(evironment mapping)、动态阴影(dynamic shadow)、全屏后处理效果(full-screen post-processing effect)等。其中全屏后处理效果包括高动态范围(high dynamic tange, HDR)光照、敷霜效果(bloom)、全屏抗锯齿(full-screen anti-aliasing, FSAA)、颜色较正(color correction)等。其中颜色较正包括颜色偏移(color-shift)、略过漂白(bleach bypass)、饱和度(saturation)、去饱和度(desaturation)等。美术师一般会在这一层上面进行工作。

前端是开发者、玩家与游戏进行交互的桥梁,包括了平视显示器(heads-up display, HUD)、辅助开发的工具(如内置菜单、主控台)、图形用户界面(graphical user interface, GUI)、全动视频(full-motion video, FMV)系统、游戏内置电影(in-game cinematics, IGC)系统等。

人工智能

游戏中的传统人工智能并不是类似于深度学习的人工智能,而只是让角色看起来有智能。所有貌似拥有智能的行为都是提前硬编码好的,有限状态机和行为树是最常用的技术。现在游戏也慢慢开始加入了具有自我进化能力的人工智能,以后游戏过程中的不确定性会进一步增加。

性能分析工具

为了提升游戏运行效率,需要在研发过程中或研发完成时对游戏进行性能分析。现在比较成熟的性能分析工具有Intel的VTune、IBM的Quantify和Purify、Compuware的Bounds Checker。有些游戏引擎会开发自己的性能分析工具,例如unty内置的Profiler。一个性能分析工具大致需要具备以下功能:

  1. 支持在游戏源码中手动加入测量代码,为希望监测性能的代码进行计时。
  2. 游戏运行期间,在屏幕上显示性能统计数据,这些数据包裹CPU占用率、GPU占用率、显存占用量、内存占用量、内存使用率、最高使用率、内存泄漏量、网络延迟、FPS等。
  3. 将性能统计数据输出并保存下来,可以保存为文本文件、Excel文件等。
  4. 允许在代码内使用调试用打印语句(print statement),可以切换不同的调试输出种类,并设置输出的冗长级别(verbosity level)。

物理

游戏物理模拟是个大部头,如果项目有真实物理模拟的需求,那么一般会专门配置一位负责开发物理效果的程序员。

游戏物理和仿真物理的侧重点并不相同。仿真物理注重模拟效果的准确性,而不关注性能。游戏物理不追求模拟百分百正确,只要最终的效果看起来合理就好,需要特别关注性能表现。因为游戏需要在配置一般的设备上运行,没有太多的算了投放到物理模拟中。只要效果看起来没太大问题,那么它就是对的。

动画

动画同样是一个大部头,如果项目的动画很多且复杂细腻,一般也会专门配置一位专门负责开发动画效果的程序员。

动画效果可以很简单,也可以很复杂。最简单的就是播放单个帧动画,复杂的可以搞基于物理的动画、IK效果等。

负责游戏动画的程序员除了要做好表现效果之外,还要做好资源管理,包括动画资源和动画状态机资源。因为现在大部分项目都是使用动画状态机以及动画融合技术来制作动画效果。

一个表现效果可能由多个动画clip融合而成。使用这种方案来做动画表现,产出的动画资源一般都不少。

如果某个模型的动画表现比较细腻的话,它的动画状态机也会很复杂。我曾经见过一个动画状态机打开之后整个屏幕都是密密麻麻的transition连线。

人体学接口设备(HID)引擎

HID引擎会将游戏外设和游戏引擎对接起来。比较常见的游戏外设有键盘、鼠标、手柄。还有一些比较小众的游戏外设,例如赛车模拟设备(方向盘+踏板+挡杆+手刹)、飞行摇杆、VR控制器。

xbox手柄
ps手柄
ns手柄
健身环
赛车模拟设备

游戏外设的输入信号会先被映射为输入代码,再映射为游戏的具体操作。

音频

游戏的音频也同样重要,好的音频效果可以营造良好的游戏氛围。一般游戏引擎都有自己研发的音频功能,例如cocos、unity、unreal都有。但是在游戏开发过程中一般不会直接使用引擎提供的功能,而是会使用第三方SDK,例如FMOD、Wwise。因为第三方SDK功能更加完备。

网络

游戏引擎提供基本网络通信功能并不是什么特别难的事情,但是要提供一套成熟通用的网络同步功能非常困难。不同游戏对网络同步的需求由很大的区别,所以游戏项目组一般都会开发自己的网络同步功能以匹配自己的游戏业务需求。

数字内容创作(digital content creation, DCC)应用软件及资产调节管道

设计师会通过DCC工具将模型、材质、贴图、音频等工具生产游戏素材。团队一般都会使用市面上以由的DCC工具,例如3DMax、Maya、PhotoShop、FMOD Studio等。这些工具输出的资源格式在大部分情况下没有办法被游戏引擎直接使用,需要游戏引擎对这些资源进行一次转换,转换为游戏引擎方便使用的格式。这个转换过程有资产调节管道来完成。例如每次往unity中拖入fbx模型资源的时候都会出现一个import进度条,正是在进行资源转换。

最后

这节只是简单带过了各种模块的知识,由于部分内容展开之后量会非常大,所以会在该系列的后续文章中单独讲,也可能会另开一个专栏。希望能帮助到想要从事游戏研发的人。

参考资料

  • 《游戏引擎架构》
  • 《游戏编程权威指南》
  • 《GAMES104-现代游戏引擎:从入门到实践》

私信太多,回复不过来,资料我直接整理出来放在下面了


觉得有帮助的话可以点个赞让更多人看到

系列内容会更新到专栏「游戏引擎从入门到入土」