第一章 导论
游戏引擎的技术
- 低阶基础系统(low-level foundation system)
- 渲染引擎(rendering engine)
- 碰撞系统(collision system)
- 物理模拟(physics simulation)
- 人物动画(character animation)
- 游戏性基础层(gameplay foundation layer)
- 游戏对象模型(game object model)
- 世界编辑器(world editor)
- 事件系统(event system)
- 脚本系统(scripting system)
游戏性编程(gameplay programming)
- 玩家机制(player mechanics)
- 摄像机(camera)
- 人工智能(artificial intelligence, AI)
1. 典型游戏团队的结构
游戏工作室(game studio)通常包含5个专业领域的人员
工程师(engineer)
- 运行时程序员(runtime programmer)
- 工具程序员(tool programmer)
领导角色:lead engineer、technical director, TD、chief technical officer, CTO
艺术家(artist)
- 概念艺术家(concept artist)
- 三维建模师(3D modeler)
- 前景建模师(foreground modeler):其中包含负责人物建模的角色建模师(character modeler)或称为角色艺术家(character artist)
- 背景建模师(background modeler):又叫关卡建模师(level modeler)、环境建模师(environment modeler)或关卡美术设计师(level artist)
- 纹理艺术家(texture artist)
- 灯光师(lighting artist)
- 动画师(animator)
- 动画捕捉演员(motion capture actor)
- 音效设计师(sound designer)
- 配音演员(voice actor)
- 作曲家(composer)
领导角色:艺术总监(art director)
游戏设计师(game desinger)
关卡设计师(level designer)、作家(writer)
领导角色:游戏总监(game director)
制作人(producer)
其他管理/支持人员(市场策划、法律、信息科技/技术支持、行政等)
2. 游戏是什么
电子游戏作为软实时模拟
软实时(soft real-time)互动(interactive)基于代理(agent-based)计算机模拟(computer simulation)
建模(model):近似化(approximation)、简化(simplification)
基于代理
时间性模拟(temporal simulation):动态的(dynamic)、互动时间性模拟(interactive temporal simulation)、互动实时模拟(interactive real-time simulation)
时限(deadline)
软实时系统(soft real-time system)
3. 游戏引擎是什么
没有工作室可以完美地划分游戏和引擎。因为随着游戏设计的逐渐成形,这两个组件的定义会经常转移。
数据驱动架构(data-driven architecture)或许可以用来分辨一个软件的哪些部分是引擎,哪些部分是游戏。
大部分游戏引擎是针对特定游戏及特定硬件平台精心制作及微调的。因为设计高效的软件需要取舍,而这些取舍是基于一些假设的。
4. 运行时引擎架构
(1) 目标硬件
(2) 设备驱动程序
(3) 操作系统
(4) 第三方软件开发包和中间件
- 数据结构及算法
- 图形
- 碰撞和物理
- 角色动画
- 人工智能
- 生物力学角色模型
(5) 平台独立层
(6) 核心系统
核心系统层的一些常见功能:
- 断言(assertion)
- 内存管理
- 数学库:提供矢量(vector)、矩阵(matrix)、四元数(quaternion)旋转、三角学(trigonometry)、直线/光线/球体/平截头体(frustum)等的几何操作、样条线(spline)操作、数值积分(numerical integration)、解方程组等
- 自定义数据结构及算法:基础数据结构(链表、动态数组、二叉树、散列表等)以及算法(搜寻、排序等)。
(7) 资源管理
(8) 渲染引擎
最大及最复杂的组件之一。通常采用分层架构(layered architecture)。
a. 低阶渲染器(low-level renderer)
着重于高速渲染丰富的几何图元(geometric primitive)集合。
低阶渲染器通常提供视区(viewport)抽象,每个视区结合了摄像机至世界矩阵(camera-to-world matrix),三维投影参数如视野(field of view)、近远剪切平面(near/far clipping plane)的位置等。
低阶渲染器也使用**材质系统(material system)及动态光照系统(dynamic lighting system)**去管理图形硬件的状态和游戏的着色器(shader)。
- 材质:描述当渲染图元时,该使用什么纹理(texture),设置什么设备状态,并选择哪一对顶点着色器(vertex shader)和像素着色器(pixel shader)。
- 光源:决定如何应用动态光照计算于图元上。
i. 图形设备接口(graphics device interface)
ii. 其他渲染器组件
收集须提交的几何图元(geometric primitive,又称为渲染包/render packet),包括:网格(mesh)、线表(line list)、点表(point list)、粒子(particle)、地形块(terrain patch)、字符串等。
b. 场景图/剔除优化
基于某些可视性判别算法去限制提交的图元数量。
低阶渲染器不太考虑图形是否确实可见(除了背面剔除(back-face culling)和摄像机平截头体的剪切平面)。
非常小的游戏世界可能只需要平截头体剔除(frustum cull)算法。比较大大的游戏世界需要较高阶的**空间细分(spatial subdivision)**数据结构,这种数据结构可以快速判别潜在可见集(potentially visible set, PVS),令渲染更有效率。
- 二元空间分割树(binary space partitioning, BSP tree)
- 四叉树(quadtree)
- 八叉树(octree)
- kd树
- 包围球树(bounding sphere tree)
- ……
空间分割又是称为场景图(scene graph),尽管技术上这是另一种数据结构,并不归入空间分割。渲染引擎软件层也可应用入口(portal)及遮挡剔除(occlusion culling)等方法。
c. 视觉效果
包括:
- 粒子系统(particle system),用作烟、火、水花等。
- 贴花系统(decal system),用作弹孔、脚印等。
- 光照贴图(light mapping)及环境贴图(environment mapping)。
- 动态阴影(dynamic shadow)。
- 全屏后期处理效果(full-screen post effect),在渲染三维场景至屏外缓冲(off-screen)后使用。
- 高动态范围(high dynamic range, HDR)光照及敷霜效果(bloom)。
- 全屏抗锯齿(full-screen anti-aliasing, FSAA)
- 颜色校正(color correction)及颜色偏移(color-shift)效果,包括略过漂白(bleach bypass)、饱和度(saturation)、去饱和度(desaturation)等。
游戏引擎常有效果系统组件,专门负责管理粒子、贴花、其他视觉效果的渲染需要。粒子和贴花通常是渲染引擎的读出组件,并作为低阶渲染器的输入端。
渲染引擎通常在内部处理光照贴图、环境贴图、阴影。
全屏后期效果可以在渲染器内实现,或在运行于渲染器输出缓冲的独立组件内实现。
d. 前端
大多数游戏为了不同目的,都会使用一些二维图形去覆盖三维场景。这些目的包括:
- 游戏内的平视显示器(heads-up display, HUD)
- 游戏内置菜单、主控台、其他开发工具(可能不随最终产品一起发行)。
- 游戏内置图形用户界面(graphic user interface, GUI)
这类二维图形通常会用附有纹理的四边形(quad)(一对三角形)结合正射投影(orthographic projection)来渲染。另一种方法是用完全三维的四边形公告板(billboard)渲染,这些公告板能一直面向摄像机。
**全动视频(full-motion video, FMV)**系统,该系统负责播放之前录制的全屏幕电影。
**游戏内置电影(in-game cinematics, IGC)**系统,该组件可以在游戏本身以三维形式渲染电影情节。
(9) 剖析和调试工具
游戏工程师经常要剖析游戏性能,以便优化。内存资源容易短缺,开发者也要大量使用内存分析工具(memory analysis tool)。
包括剖析工具和游戏内置调试功能。
调试功能包括:调试用绘图、游戏内置菜单、主控台,以及能够录制及回放游戏过程的功能。
(10) 碰撞和物理
碰撞检测(collision detection)
刚体动力学模拟(rigid body dynamics)
一些游戏包含真实或半真实的动力学模拟(dynamics simulation),这在游戏业界里称为“物理系统(physics system)”,比较正确的术语是刚体动力学模拟,因为游戏中通常只考虑刚体的运动(motion),以及产生的力(force)和力矩(torque)。研究运动的物理学分支是运动学(kinematics),而研究力和力矩是动力学(dynamics)。
碰撞和物理系统一般是紧密联系的。因为碰撞发生时,碰撞几乎总是由物理积分及约束满足(constraint satisfaction)逻辑来解决的。
引擎通常使用第三方的物理SDK。
(11) 动画
游戏会用到5种基本动画:
- 精灵/纹理动画(sprite/texture animation)
- 刚体层次结构动画(rigid body hierarchy animation)
- 骨骼动画(skeleton animation)
- 每顶点动画(per-vertex animation)
- 变形目标动画(morph target animation)
现今游戏中,骨骼动画是最盛行的动画方式。典型的骨骼动画系统:
动画状态树及层 | 反向动力学(IK) | 游戏专用的后期处理 |
线性插值及加法混合 | 动画播放 | 子骨骼动画 |
动画解压 |
骨骼网格渲染组件是连接渲染器和动画系统的桥梁。动画系统生成骨骼中所有骨头的姿势,这些姿势以矩阵调色板(matrix palette)形式传至渲染引擎。之后渲染器利用矩阵表去转换顶点,每个顶点用一个或多个矩阵生成最终混合顶点位置。此过程称为蒙皮(skinning)。
当使用**布娃娃(ragdoll)**时,动画和物理系统便产生紧密耦合。布娃娃是无力的(经常是死了的)角色,其运动完全由物理系统模拟。物理系统把布娃娃当作受约束的刚体系统,用模拟来决定身体每部分的位置及方向。动画系统计算渲染引擎所需的矩阵表,用来在屏幕上绘画角色。
(12) 人体学接口设备
游戏的玩家输入来自多个人体学接口设备(human interface device, HID),如:
- 键盘和鼠标
- 游戏手柄(joypad)
- 其他专用游戏控制器
该组件有时称作**玩家输入/输出(player I/O)**组件,因为有些人体学接口设备也提供输出功能,如力反馈/震动、音频输出等。
HID引擎从硬件取得原始数据,为每个摇杆(stick)设置环绕中心点的死区(dead zone),去除按钮抖动(de-bounce),检测按下和释放按钮事件,演绎加速计(accelerometer)的输入并使其平滑等。HID引擎通常容许玩家调整输入配置。HID引擎也可能包含一个系统,负责检测弦(chord)(即数个按钮一起按下)、序列(sequence)(即按钮在时限内顺序按下)、手势(gesture)(即按钮、摇杆、加速计等输入的序列)。
(13) 音频
游戏引擎的音频和图形同样重要。
音频引擎的功能差异很大。
(14) 在线多人/网络
多人游戏最少有4种基本形式
- 单屏多人(single-screen multiplayer)
- 切割屏多人(split-screen multiplayer)
- 网络多人(networked multiplayer)
- 大型多人在线游戏(massively multiplayer online game, MMOG)
多人网络层:
- 安排比赛及游戏管理
- 对象管辖权策略
- 游戏状态复制
支持多人游戏会深切影响某几个游戏引擎组件的设计。游戏世界对象模型、人体学接口设备、玩家控制系统、动画系统等都会收到影响。
(15) 游戏性基础系统
**游戏性(gameplay)**是指:游戏内进行的活动、支配游戏虚拟世界的规则(rule)、玩家角色的能力(也称为玩家机制/player mechanics)、其他角色和对象的能力、玩家的长短期目标(goal and objective)。游戏性通常用两种编程语言实现,除了用引擎其余部分使用的原生语言,也可用高阶脚本语言,又或者两者皆用。
为了连接低阶的引擎子系统和游戏性代码,多数游戏引擎会引入一个软件层,笔者称之为游戏性基础层(gameplay foundation layer)。该软件层提供一组功能,以方便实现其上的游戏专有逻辑。
a. 游戏世界和游戏对象模型
游戏世界含动态及静态元素。游戏世界的内容通常用面向对象方式构建(多数使用面向对象语言)。组成游戏的对象类型集合,称为游戏对象模型(game object model)。游戏对象模型为虚拟游戏世界里的各种对象集合提供实时模拟。
典型的游戏对象集合:
- 静态背景几何物体,如建筑、道路、地形(常为特例)等。
- 动态刚体,如石头、饮料罐、椅子等。
- 玩家角色(player character, PC)。
- 非玩家角色(non-player character, NPC)。
- 武器。
- 抛射物(projectile)。
- 载具(vehicle)。
- 光源(可在运行时用于动态场景,也可离线用于静态场景)。
- 摄像机。
游戏对象模型与**软件对象模型(software object model)**紧密结合。软件对象模型是指,用于实现面向对象软件的一组语言特征、原则(policy)、惯例(convention)。
b. 事件系统
事件驱动架构(event-driven architecture)常用于典型图形用户界面,也常用于对象间通信。
c. 脚本系统
使游戏独有游戏性的规则和内容,能更易、更快地开发。
d. 人工智能基础
一般而言,人工智能(artificial intelligence, AI)一直是为个别游戏专门开发的软件,一般不隶属于游戏引擎。但近期游戏开发商找到一些差不多每个AI系统都共有的模式,使这些基础部分逐渐进入游戏引擎的范畴。
(16) 个别游戏专用子系统
5. 工具及资产管道
游戏引擎需要读取大量数据,包括游戏资产(game asset)、配置文件、脚本等。
(1) 数字内容创作工具
美术人员使用数字内容创作(digital content creation DCC)应用软件制作。
(2) 资产调节管道
DCC应用所使用的数据格式,鲜有适合直接用于游戏中的,主因有二:
- DCC软件在内存中的数据模型,通常比游戏所需的复杂很多。游戏引擎通常只需这些信息的一小部分就能在游戏中渲染模型。
- 在游戏中读取DCC软件格式的文件,其速度通常过慢。有些格式更是不公开的专有格式。
因此,通常需要导出为更容易读取的标准格式或自定义格式,以便在游戏中使用。
当数据自DCC软件导出后,有时必须再处理,才能放在游戏引擎里使用。
从DCC到游戏引擎的管道,有时称为资产调节管道(asset conditioning pipeline)。每个引擎都有某种形式的资产调节管道。
(3) 三维模型/网格数据
游戏中可见的几何图形,通常由两种数据组成。
a. 笔刷几何图形
笔刷几何图形(brush geometry)由凸包(convex hull)几何定义,每个凸包则由多个平面定义。笔刷通常直接在游戏世界编辑器中创建及修改。
其优点为:
- 制作迅速简单。
- 便于游戏设计师用来建立粗略关卡,制作原型。
- 既可以用作碰撞体积(collision volume),又可用作可渲染几何图形。
其缺点为:
- 分辨率低,难以制作复杂图形。
- 不能支持有关节的(articulated)物体或运动的角色。
b. 三维模型(网格)
对于细致的场景元素而言,三维模型(3D model,也称为网格/mesh)优于笔刷几何图形。
网格是复杂的图形,由三角形和顶点(vertex)组成。网格也可以由四边形和高次细分曲面(higher order subdivision surface)建立。但现时的图形硬件,几乎都是专门为渲染光栅化三角形而设计的,渲染前须把所有图形转换为三角形。每个网格通常使用一个或多个材质(material),以定义其视觉上的表面特性,如颜色、反射度(reflectivity)、凹凸程度(bumpiness)、漫反射纹理(diffuse texture)等。
网格通常在三维建模软件里制作。我们必须编写导出器(exporter)才能从DCC工具获取数据并储存为引擎可读的格式。
(4) 骨骼动画数据
骨骼网格(skeletal mesh)是一种特殊网格,为关节动画而绑定到骨骼层次结构(skeletal hierarchy)之上。骨骼网格在看不见的骨骼上形成皮肤,因此,骨骼网格有时候又称为皮肤(skin)。骨骼网格的每个顶点包含一组关节索引(joint index),表明顶点绑定到骨骼上的哪些关节。每个顶点也包含一组关节权重(joint weight),决定每个关节对该顶点的影响程度。
游戏引擎需要3种数据去渲染骨骼网格。
- 网格本身。
- 骨骼层级结构,包含关节名字、父子关系、当网格绑定到骨骼时的姿势(bind pose)。
- 一个至多个动画片段(animation clip),指定关节如何随时间而动。
网格和骨骼通常由DCC软件导出成单个数据文件。可是,如果多个网格都绑定到同一个骨骼,那么骨骼最好导出成独立的文件。而动画通常是分别导出,特定时刻可只载入需要的动画到内存。然而,有些引擎支持导出动画库(animation bank)至单个文件,有些引擎更把网格、骨骼、动画全部放到一个庞大的文件里。
未优化的骨骼动画是由以每秒30帧的频率,对骨骼中每个关节采样(sample),记录成4×3矩阵。因此,动画数据生来就是内存密集的,通常会用高度的压缩的格式储存。
(5) 音频数据
音频片段(audio clip)有不同的格式和采样率(sampling rate)。音频文件可为单声道(mono)、立体声(stereo)、5.1、7.1或其他多声道配置(multichannel configuration)。音频文件通常组织成音频库(audio bank),以方便管理、容易载入及串流。
(6) 粒子系统数据
当今游戏采用复杂的粒子效果(particle effect),粒子效果由视觉特效的专门设计师制作。多数引擎有自制的粒子效果编辑工具,只提供引擎支持的效果。
(7) 游戏世界数据及世界编辑器
游戏引擎的所有内容都集合在游戏世界。不少商用游戏引擎提供优良的世界编辑器。
(8) 一些构建工具的方法
可以用不同方式去构建游戏引擎工具套装。一些工具可能是独立的软件,一些工具可能构建在运行时引擎使用的低阶软件层之上,一些工具可能嵌入游戏本身。