游戏引擎解构
游戏引擎解构

游戏引擎解构

source: wiki、scholar、知乎、csdn、unity.com

file

  游戏引擎的核心组件包括:物理引擎、渲染引擎、音效这三个部分,而一个完整的游戏引擎还应该包括脚本引擎和网络引擎以及一些其他的扩展。下面,以Unity3D为例,简单分析各个引擎的功能以及实现上的一些问题。

Unity3D

  物理引擎确保虚拟世界的物体能够按照物理规律运动并进行相互作用,碰撞检测是物理引擎的核心。实现了物理引擎,就可以使多个物体在后台运动了,渲染引擎和音效模块则是负责将后台模拟的场景通过人类可感知的方式传递给开发者,分别是视觉和听觉的传递。通过物理、渲染、音效三大引擎,我们就可以完成从虚拟世界到现实世界的信息传递;反过来,如果我们想对虚拟世界的某个物体或者场景进行控制,就需要用到脚本引擎,通过编写与场景或者物体绑定的脚本,我们可以实现在场景中编辑物体,或者设定物体的初始状态,包括:位置、速度等。有了上述四个引擎,开发者就可以与虚拟世界进行交互了,而五大引擎中的网络引擎,事实上是一个应用层面的工具,包括自动下载远端资源、本地文献或资源管理等,用于提高开发者的工作效率。再有就是其他的一些模块,比如:动画机制、AI组件等等。

物理引擎

  物理引擎有很多成熟且开源的实现,比如:Physx、Havok、Bullet。Unity的物理引擎就是在Physx基础之上封装而成。
  物理引擎的核心是解决不同类型的物体的运动以及不同类型的物体之间碰撞的问题。如果说实现一个比较粗糙的物理引擎,可以将物体大致归为刚体、软体、流体和粒子。这里的粒子说的是诸如发生爆炸后产生的碎块的大规模运动。定义完上述对象在虚拟世界的运动规律后,再解决不同物体接触时发生的状态变化,也就是碰撞检测,一个基本的物理引擎就实现了。
  从程序设计的角度考虑,物理引擎的每次更新分为四个步骤

  • BoardPhase 此阶段主要是快速地排除掉没有约束(这里的约束一般指碰撞)关系的对象,被排除掉的对象不会再进行后续的检测和约束解决。
  • NarrowPhase 此阶段会对可能发生约束的对象进行准确的判断,通过准确的判断后,我们可以得到两个物体发生碰撞的碰撞点,穿透深度,分离法线等等。
  • ResolvePhase 如果发生碰撞约束,或者存在其他人为定义的约束关系,我们就需要解决约束。通过解决约束,两个物体的位置、朝向和速度、角速度等属性会保持满足约束等式或者不等式。
  • Intergration 此阶段非常好理解,就是把物理模拟的结果同步到上层应用中,也就是我们的游戏引擎中,例如物体位置的变化,或者碰撞发生的回调等等。

渲染引擎

  尽管物理引擎是虚拟世界的内核,渲染引擎却决定了我们看到的虚拟世界是什么样的,它负责对虚拟世界的物理参数进行渲染。Unity的渲染是使用JavaScript实现的,事实上和现有的前端渲染技术大体相同,但是要复杂得多。

  当3D模型制作完毕之后,美工会按照不同的面把材质贴图赋予模型,这相当于为骨骼蒙上皮肤,最后再通过渲染引擎把模型、动画、光影、特效等所有效果实时计算出来并展示在屏幕上。渲染引擎在引擎的所有部件当中是最复杂的,它的强大与否直接决定着最终的输出质量。

音效、脚本引擎、网络引擎

  音效的功能性质和渲染类似,只是负责的硬件不同。
  通过脚本引擎可以将场景中的每一个物体都与程序中的某个对象绑定,可以通过脚本修改虚拟世界的物体的参数、控制其行为。
  网络引擎是应用层面的工具,基本功能包括对本地和远程资源的查询和管理,几乎无处不在,脚本编辑器中的自动补全甚至也可以算是依托网络引擎实现的功能。

动画和AI组件

  动画算是一种抽象和复用,在特定的事件触发后,播放一段动画,是一种常用的游戏开发手段。
  将AI算法封装成库,借助脚本引擎,实现对虚拟场景中的agent的智能控制。比如Unity的开源组件ML-Agents。

游戏引擎调研

  

发表回复

您的电子邮箱地址不会被公开。