首页 > 其他 > 详细

游戏引擎底层解析(一)——运行组件底部

时间:2021-04-03 09:27:04      阅读:18      评论:0      收藏:0      [点我收藏+]

 

引言:

  相信很多人都听说过,许多大厂为了提高游戏开发的效率,抛弃了市场上的主流引擎(如unity、ue4、cryengine、寒霜等),让引擎开发岗的打工人定制自家的游戏引擎。这听起来很炫酷,因为即使是外行人也能猜到开发一个独立的游戏引擎多么困难。事实上,所有的游戏引擎都有一个通用的软件架构,只不过不同的游戏引擎会有不同的倾向——如果自家想做moba,就可以开发一个moba专用框架引擎(网易在研);如果想做2D的大型游戏,可以开发一个对2D物理和渲染加以处理,抛弃3D功能的引擎,以此类推。当然有人会说unity、ue4这样全能的引擎在各个功能方面都很突出,这是因为人家就是靠卖引擎吃饭的,国内厂家的自研引擎肯定没得比。所以我们没必要去解析那些超级引擎,只需要简单了解一下引擎底层架构就好了。

  这里也吐槽一点,之前在csdn、博客园等blog站上搜索过关于游戏引擎架构的文章,希望能看到大神们对于游戏引擎内部的详细剖析。但事实是很少有人做这方面的博客,就算做了也只是把书上的图往blog上一贴,然后每个模块就从书上抄一句话……不知道他们是不是真的懂了,但至少他们的博客没想让我们懂(可能有的博主单纯只是做笔记给自己看吧,外人从他们的博客上是真的完全学不到东西)所以我在撰写博客的时候,一定是在自己理解的前提下,尽力向观众老爷们解释清楚,我认为只有这样才能既检验了自己,又帮助了他人,才是具有含金量的博客。(当然我的知识储备很匮乏,难免会犯错,希望大佬可以在评论区指正)

  游戏引擎主要可以分割为两部分,第一部分为运行组件,即游戏引擎在运作游戏时会涉及到的底层部分,其中的任何结构都是紧密连接、不可丢弃的;第二部分为工具套件,即提供游戏数据及资产的数字内容创作、处理工具。由于引擎的架构非常庞大,想要一篇blog全部阐释完不太现实,因此一共打算分3p:运行组件底部、运行组件顶部、工具套件。本篇介绍的是运行组件底部,主要指的是运行时组件的硬件及api部分。

 

正文:

  话不多说,先上图:

技术分享图片

  上图是运行时组件的一个结构预览,我们从硬件开始逐步向上进行说明。(每一部分我会单截一个图,辅助大家理解)

 

硬件、驱动、操作系统:

  硬件是一切资源运行的基础。强调硬件主要是因为游戏引擎做出的游戏需要在不同的主机上进行运作,如图中的PC、PS4、移动端平台。硬件过于底层、不易详解,再加上这部分懂与不懂完全没影响,就直接跳过了。

  驱动指的是设备驱动程序,我们知道驱动程序的目标是链接硬件与操作系统,从而使设备和计算机完成通信的中间组件。驱动就像一个多语言翻译官,它的好处在于隔离了操作系统和引擎的上层,使得引擎上层无需对所有不同种类的硬件进行逐个适配。

  缘于我的操作系统课刚结课,所以os方面我可以说的详细一点。从图中可以看出游戏引擎中会有很多软件层,相应的就会产生很多进程或程序,这个时候就需要操作系统来进行系统地指挥、调度这些进程,让他们不会发生错序、饿死、严重死锁等问题。现代的操作系统使用的多任务方式叫做“抢占式多任务”,指的是操作系统会逐个询问进程是否要占用cpu,如果是的话就让他用,但不久后会剥夺它的cpu使用权再让下一个进程使用,这样有效地防止了进程饿死和一个进程出问题把后面的进程全部卡死的危险。通过这种方法,在微观上呈现出来的是多个进程在交替运行(最小交替间隔为一个时间片),而从宏观上看,多个进程便是同时运作、共享硬件(ps:是并发不是并行!)。既能够合理地调度所有进程,又能满足程序运作的需求,这一切都是操作系统的功劳。
    在过去的游戏主机上,操作系统的概念比较模糊,因为游戏主机最主要的功能就是运行游戏,所以游戏程序可以直接无限制地抢占内核,但是随着时代进步,许多游戏主机也开始加入了一些非游戏的功能(如导航菜单、通过系统资源显示在线信息),这个时候操作系统便又要站出来了。这也是为什么说Xbox360等主机和PC开发不再拥有明显界限。

 

第三方软件开发包:

技术分享图片

  这部分涵盖的东西有点多,可以一个一个来看。
  首先是我们图形学领域的老朋友:渲染。这里指的其实是图形编程接口,主流的接口如opengl、directX,还有libgcm、Edge等。游戏嘛,最重要的是视觉效果,所以渲染是非常重要的。(当然大家不要被我写的软渲染器所误导,以为渲染器真的是用C++来搭建的,事实上C++只是相对于C#、Java效率更高,渲染方面C++在图形接口面前还是个弟中弟)现在的主流引擎大部分使用的还是directX9~12,移动端的话大部分使用opengl,像libgcm、Edge这些都是面向PlayStation3设计的,我们一般不关注这个。

  接下来是游戏引擎一大特色:物理引擎。顾名思义,物理引擎就是模拟真实世界物理效果的库或包,我们说要想让游戏代入感强,一是渲染画面要真实,二是物理效果要符合实际。一个拥有良好物理引擎的游戏引擎不仅会被应用到游戏领域,还会被应用到动画、工程仿真领域,足见物理引擎的重要性。物理引擎包括很多方面,但最基础的两个——碰撞检测和刚体动力学是必须具备的,往深了看还会有动力学约束求解等等高级算法。遗憾的是开源的物理引擎sdk太少,没办法研究其实现原理。

  下一个内容是C++库。你可能没有听过Boost,但你一定知道STL库(vector、map、sort……有没有想起被程序设计支配的恐惧)。适当地使用C++库可以有效地提升开发效率,但要注意的是,游戏引擎是一个极其庞大的架构,因此对于内存管理切忌浪费。当分配内存成为一门学问时,无脑使用C++库就不太行啦。

  接下来的这个Kynapse让我有点迷惑,它是一个人工智能中间件,但却被放在了如此底层的位置,或许因为它也是完全调用的外部sdk?Kynapse的功能描述为“能够在复杂的地形中,模拟先进的动态三维自动寻路、环境感知与大规模群体移动。其还支持空间推理仿真与团队协作,提供高效的生产工具,帮助简化游戏创建。”简而言之就是三大功用——寻路、认知与决策。随着时代的进步,人工智能技术飞速增长,遗憾的是Kynapse早已停止维护了,现在它还会偶尔出现肉眼可见的bug和智障行为。(不过都说人工智能本来就是玄学,所以也无需追究这些bug辣)

  最后说一下动画套件。随着3D动画技术的进步,动画和物理渐渐的被捆绑在了一起,比如骨骼动画。现在比较流行的动画套件有Granny、Havok Animation、Edge,基本上是集成了动画、渲染、物理于一体,之后像Endorphin等插件还可以完成生物力学模拟、运动平衡等功能,可以说是啥都能干,所以我个人认为这里的“动画”不仅指的是传统的动感画面,还囊括了各种其他领域的技术和知识。

 

平台独立层

技术分享图片

  平台独立层的一大目标就是跨平台。为了能够让引擎上层适配不同种类的硬件、操作系统,平台独立层将引擎上层与系统底层分隔开,使用多种sdk或一些现成的模块来完成适配。这里面仍然以Boost、stl等C++库为主,Boost可以完成平台检测(平台版本、性质检索)、原子数据类型(如果你学过操作系统的话,应该对线程的“锁”比较熟悉,锁就是为了保障原子操作而引入的)、集合及迭代器(集合就比如vector、list等等,然后用iterator规定一个迭代)、网络传输(例如asio,既可以面向win也可以面向linux),stl库可以完成文件系统的操作、高分辨率时钟(clock_t类型,可以精确到微秒)、线程库(学过os的都懂,没学过os的我也不好解释)。此外图形包裹类的概念似乎已经不太提了,至于物理包裹类,我只知道它一直是必需品,但我并没有查阅到任何相关的sdk,所以只能理解为这部分需要开发人员亲自动手做吧。
  上面这些模块可能看起来很陌生,但事实上它们就是一个从自由的引擎上层向系统底层的一个过渡阶段。引擎上层的自由度很大,自己定义出来的一些东西不一定能适配操作系统,但我们知道独立层这些内容如线程、文件、时钟等是所有操作系统都认可兼容的,所以我们使用平台独立层将两者串联了起来。

 

核心系统

技术分享图片

 

  这里要提示的是,虽然前面阐述了许多sdk,但它们只是用来简化工作量的,并不能称作我们引擎的核心系统。何谓核心系统?就是我们上层所依赖的一切实用软件,这些实用软件的功能和我们引擎所需实现的一切功能都有密不可分的关系。如断言模块为我们引擎捕捉逻辑错误,内存分配模块为运作引擎和运行游戏合理分配内存,数学库就更不用提了……
  当然核心系统内部包含的个别模块仍有争议,去询问各路引擎大神、查阅论文也都能查出不同的结果,所以我在这里就不一一去介绍啦,像内存分配、数学、字符串、日志、语法分析、随机数、IO大家多少都有点了解,而序列化、曲线曲面等我也会在其他的博客中进行详解。在这里我们只需要知道核心系统就是区别于纯第三方库的实用软件就ok了。

 

资源管理器

技术分享图片

 

  这个模块就比较简单了。在游戏开发的过程中,我们会向游戏引擎导入许多游戏资产,如上图所示,有模型、纹理、材质、字体等等,为了让游戏能跨设备运行,游戏引擎必须将导入好的资产进行打包、压缩。管理器主要分为两个模块:一个是资源管理,一个是内存管理。具体的管理方法其实有点像操作系统里学的内存管理方法,开辟缓冲区->访问内存区->调度资源并存入。思想就是在保证数据不损坏、规则不过于复杂的基础上,尽可能地节约空间、加大压缩力度。虽说这部分的难度会相对小一些,但调度算法、内存处理基本上需要开发人员自己来搞,所以仍然需要引起重视。

  本篇文章就先介绍这些。这部分内容比较偏底层,大部分内容仅供了解,不过从核心系统开始再往上,程序员的参与程度就越来越高了。核心系统还只是部分模块需要我们重构,但是像资源管理器、后文会介绍的渲染器等等,才是真正考验程序员的算法功底、软件设计功底的时候。


参考文献:
1、叶劲峰.《游戏引擎架构》
2、Star.E.《游戏引擎开发!引擎架构篇》
3、谌显,杨克俭. 游戏引擎中的资源管理器的实现[EB/OL]. 北京:中国科技论文在线 [2008-01-30]. http://www.paper.edu.cn/releasepaper/content/200801-867.

游戏引擎底层解析(一)——运行组件底部

原文:https://www.cnblogs.com/puluomi/p/14612802.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!