第一章 导论
导论篇主要介绍游戏团队结构、游戏(电子游戏)的性质及多种游戏类型的引擎(技术需求)差异、几种游戏引擎的概况和引擎架构。前几点可以当做游戏开发、游戏引擎发展及不同类型需求差异的知识补充,最后一点则能了解引擎组件的架构。
电子游戏的软实时模拟
大部分的二维或三维的电子游戏会被称为软实时(soft real-time)互动(interactive)基于代理(agent-base)计算机模拟(computer simulation)。
模拟:大部分电子游戏中会用数学方式为一些真实世界或想象世界的子集建模(model),从而使这些模型能够在计算机中运行。数学模型是现实或虚拟世界的模拟。近似化(approximation)和简化(simplification)是游戏开发者最强力的工具。
基于代理模拟:模拟中多个独立的实体(称为代理)一起互动。游戏中的大部分物体都可以视为代理,大部分游戏都有基于代理的本质,所以多数游戏开发采用面向对象(object-oriented)的编程语言,或较宽松的基于对象(object-based)编程语言。
实时互动:所有互动电子游戏都是时间性模拟(temporal simulation),即游戏世界是动态的(dynamic),游戏必须回应玩家,因而游戏是互动时间性模拟(interactive temporal simulation),最后,多数游戏会描绘游戏的故事,并实时回应玩家输入,成为互动实时模拟(interactive real-time simulation)。
软实时:时限(deadline)是所有实时模拟的核心概念,如帧率、物理模拟的频率、IA的计算频率、音频调库保证音频缓冲等。“软”实时系统是指系统即使错过期限也不会造成灾难性后果。因此,所有游戏都是软实时系统(soft real-time system),与此相比,硬实时系统(hard real-time system)错过期限可能导致操作者损伤或死亡,如直升机的航空电子系统和核能发电厂的控制棒系统。
数学模型:模拟虚拟世界是用到的数学模型可分为解析式(analytic)或数值式(numerical)。例如,刚体受地心引力下落的分析式(闭合式closed form)数学模型为:
分析式模型可为其自变量(independent variable)设任何值求解,可是大部分数学问题并没有闭合式解,在电子游戏中,由于用户输入是不能预知的,不应期望对整个游戏完成用闭合式建模。刚体受地心引力下落的数值式模型为:
为实现数值式模拟,通常要不断地重复计算,以决定每个离散时步(time step)的系统状态。
不同游戏类型的引擎差异
第一人称射击(first person shooting,FPS)
FPS是开发技术难度极高的游戏类型之一,因为FPS要让玩家面对一个精细而超现实的世界时感到身临其境。游戏业界的巨大技术创新大都来自这类游戏。技术注重:
- 高效地渲染大型三维虚拟世界
- 快速反应的摄像机控制及瞄准机制
- 玩家的虚拟手臂和武器的逼真动画
- 各式各样的手持武器
- 宽容的玩家角色运动及碰撞模型
- 非玩家角色有逼真的动画及智能
- 小规模在线多人游戏的能力,及无处不在的死亡竞赛游戏模式
平台游戏及其他第三人称游戏(platformer)
平台游戏是指基于人物角色的第三人称游戏(third person game)
技术注重:
- 移动平台、梯子、绳子、棚架及其他有趣的运动模式
- 用来解谜的环境元素
- 第三人称的“跟踪摄像机”会一直关注玩家角色
- 复杂的摄像机碰撞系统,以保证视点不会穿过背景几何物体或动态的前景物体。
格斗游戏(fighting game)
传统格斗类型注重技术:
- 丰富的格斗动画
- 准确的攻击判定
- 能侦测复杂按钮及遥感组合得玩家输入系统
- 人群,或相对静止的背景
竞速游戏(racing game)
竞速游戏包括所有以赛道上驾驶车辆或其他载具为主要任务的游戏。
经典竞速游戏的技术特征:
- 使用多种“窍门”去渲染遥远的背景,例如使用二维纸板形式的树木、山岳和山脉
- 赛道通常切开成较简单的二维区域,称为“分区”。这些数据结构用来实现渲染优化、可见性判断(visibility determination),帮助非玩家操控车辆的人工智能及路径搜寻,以及解决很多其他技术问题
- 第三人称视角摄像机通常追随在车辆背后,第一人称摄像机有时候会置于驾驶舱里
- 如果赛道经过天桥低及其他狭窄空间,必须花精力防止摄像机和背景几何物体碰撞
实时策略游戏(real-time strategy,RTS)
较老的RTS游戏基于栅格(grid-based,或称为基于单元cell-based)去构建游戏世界并使用正交投影(orthography projection);现在的RTS游戏也会使用透视投影及真三维世界,但可能仍使用栅格排列系统,以保证对齐。
RTS的惯用技术:
- 使用较低解析度的模型,使游戏支持同时显示大量单元
- 游戏的设计和进行多是在高度场地形画面上展开的
- 除了部署兵力,游戏通常允许玩家在地形上新建建筑物
- 用户互动方式通常为单击及范围选取单元,再加上包含指令、装备、作战单元种类、建筑种类等菜单及工具栏
大型多人在线游戏(massively multiplayer online game,MMOG)
MMOG的核心是一组强大的服务器。
其他类型游戏
- 体育游戏(sports)
- 角色扮演游戏(role playing game,RPG)
- 上帝模拟游戏(god game)
- 环境或社会模拟游戏(environment/social simulation)
- 解谜游戏(puzzle)
- 非电子游戏的移植
- 基于网页的游戏
- 其他类型游戏
运行时引擎架构
游戏引擎通常由工具套件和运行时组件两部分构成。
游戏引擎是以软件层(software layer)构建的软件系统,通常上层依赖下层,下层不依赖上层(下层依赖上层称为循环依赖,应极力避免,否则会导致复杂的耦合(coupling))。
目标硬件
用来执行游戏的计算机系统或游戏主机,包括:PC、XBox、PS、NDS等。
设备驱动程序
设备驱动程序(device driver)是由操作系统或硬件厂商提供的最低阶的软件组件,负责管理硬件资源,也隔离了操作系统及上层引擎,使上层软件无需理解不同硬件版本的通信细节差异。
操作系统
(PC)操作系统协调一台电脑上多个程序的执行,如Windows使用时间片(time-slice)的方式,使多个程序共享硬件,这称为抢占式多任务(preemptive multitasking)。
第三方软件开发包和中间件
软件开发包(software development kit, SDK)提供基于函数或基于类的接口,一般称为应用程序接口(application programming interface,API)。
数据结构及算法
游戏非常依赖数据结构(data structure)集合,以及操作这些数据的算法(algorithm)。例如:
- STL:C++标准模板库(standard template library,STL)提供丰富的代码及算法去管理数据结构、字符串及基于流(stream)的输入、输出
- STLport:可移植的、经优化的STL实现
- Boost:强大的数据结构和算法库,采用STL风格
- Loki::强大的泛型编程(generic programming)模板库
游戏开发者对于STL库的使用问题分为两种:不使用者认为STL的内存分配模式不高效,也导致内存碎片化,使用者认为STL的强大和方便性超过问题。作者观点:PC上有高级的虚拟内存(virtual memory)系统,可以解决内存分配问题,游戏主机上只有有限的虚拟内存功能,而且缓存命中(cache)失败的代价极高,最好使用自定义的数据结构。
图形
- Glide:专门为古老的Voodoo显卡而设。
- OpenGL:获广泛使用的跨平台SDK
- DirectX:微软的SDK
- libgcm:索尼提供的低阶直接接口(PS)
- Edge:顽皮狗和索尼为PS3制作的强大高效渲染及动画引擎
碰撞和物理
碰撞检测(collision detection)和刚体动力学(rigid body dynamic)(物理)
- Havok
- PhysX:NVIDIA提供
- Open Dynamic Engine(ODE)
角色动画
- Granny:Rad Game Tools公司的工具套件,支持主要三维建模及动画制作软件如Maya、3ds Max等。
- Havok Animation
- Edge:
人工智能
- Kynapse:提供低阶的AI构件,如:路径搜寻、静态和动态物体回避、空间内的脆弱点辨认以及相当好的AI和动画接口
生物力学角色模型
- Endorphin、Euphoria
平台独立层
大多数游戏引擎需要运行于不同的平台上(第一方工作室的自研引擎除外),因此大部分游戏引擎都有一个平台独立层(platform independent layer)。
平台独立层包装了常用的标准C语言库、操作系统调用及其他基础API,确保了接口在所有硬件平台均为一致。
核心系统
游戏引擎以及其他大规模复杂C++应用软件,都需要一些有用的实用软件(utility),称为“核心系统(core system)”。
- 断言(assertion):断言是一种检查错误的代码。断言会插入代码中捕捉逻辑错误或找出与程序员原来假设不符的错误。在最后的生产版本,一般会移除断言检查。
- 内存管理:自定义内存分配系统保证高速的内存分配和释放,并控制内存碎片所造成的影响。
- 数学库:游戏本质上就是高度数学密集的。因此,游戏引擎有一个或以上的数学库,提供矢量(vector)、矩阵(matrix)、四元数(quaternion)旋转、三角学(trigonometry)、直线/光线/球体/平截头体(frustum)等几何操作、样条线(spline)操作、数值积分(numerical integration)、解方程组等等。
- 自定义数据结构及算法:除非完全依赖第三方软件包,否则引擎通常需要提供一组工具去管理基础数据结构以及算法。
资源管理
每个引擎都有资源管理器,提供一个或一组统一的接口,去访问任何类型游戏资产及其他引擎输入数据。
渲染引擎
渲染引擎是最大及最复杂的组件之一,通常采用分层架构(layered architecture)。
低阶渲染器
低阶渲染器(low-level renderer)包括全部原始的渲染功能,设计重于高速渲染丰富的几何图元(geometric primitive)集合。可拆分为:
图形设备接口:负责使用图形SDK,枚举图形设备、初始化设备、建立渲染表面(后台缓冲、模板/stencil缓冲)等的组件
其他渲染器组件:目的为收集几何图元(又称为渲染包(render packet)),包括网格(mesh)、线表(line list)、点表(point list)、粒子(particle)、地形块(terrain patch)、字符串等;视区(viewport)结合了摄像机至世界矩阵(camera-to-world matrix)、三维投影参数如视野(field of view)、近远剪切平面(near/far clipping plane)等;使用材质系统(material system)及动态关照系统(dynamic lighting system去管理图形硬件状态和游戏的着色器(shader)。
场景图/剔除优化
平截头剔除(frustum cull)(视锥体??)算法:去除摄像机不可见物体
空间细分(spatial subdivision)数据结构:快速判别潜在可见集(potentially visible set,PVS),划分形式有多种:二元空间分割树(binary space partitioning,BSP tree)、四叉树(quadtree)、八叉树(octree)、kd树、包围器树(bounding sphere tree)。空间分割有时候称为场景图(scene graph),技术上场景图是另一种数据结构,不归入空间分割。
也可应用入口(portal)及遮挡剔除(occlusion culling)等方法。
视觉效果
- 粒子系统(particle system)
- 贴花系统(decal system)
- 光照贴图(light mapping)及环境贴图(environment mapping)
- 动态阴影(dynamic shadow)
- 全屏后期处理效果(full-screen post effect)
- 高动态范围(high dynamic range,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)系统
剖析和调试工具
包括以下功能:
- 手工插入测量代码,为某些代码计时
- 在游戏期间,与屏幕显示性能统计数据
- 把性能写入文字或Excel文件
- 计算引擎及子系统所耗内存,并显示
- 在游戏过程中或结束时,把内存使用率。最高使用率、溢出等统计输出
- 容许布满调试打印语句,可以开关不同的调试输出种类
- 游戏事件录制和回放功能
碰撞和物理
碰撞监测(collision detection),动力学模拟(dynamic simulation),称为“物理系统(physics system)”(刚体动力学(rigid body dynamic))
动画
游戏用到的五中基本动画:
- 精灵/纹理动画(sprite/texture animation)
- 刚体层次结果动画(rigid body hierarchy animation)
- 骨骼动画(skeletal animation)
- 每顶点动画(per-vertex animation)
- 变形目标动画(morph target animation)
一些概念:蒙皮(skinning)、布娃娃(ragdoll)
人体学接口设备
- 键盘和鼠标
- 游戏手柄
- 其他专用游戏控制器
也称玩家输入/输出(player I/O)组件
音频
。。。
在线多人/网络
- 单屏多人(single-screen multiplayer)
- 切割屏多人(split-screen multiplayer)
- 网络多人(networked multiplayer)
- 大型多人在线游戏(massively multiplayer online game,MMOG)
游戏性基础系统
为了连接低阶的引擎子系统和游戏性代码,引入一个软件层。
游戏世界和游戏对象模型
组成游戏的对象类型集合,称为游戏对象模型(game object model)。游戏对象模型与软件对象模型紧密结合,并且渗透于整个引擎中。软件对象模型指用于实现面向对象软件的一组语言特征、原则、惯例。
事件系统
事件驱动架构(event-driven architecture),发送者建立一个称为事件(event)或消息(message)的小型数据结构,包含要发送的消息类型及参数数据。事件传递给接收对象时,调用接收对象的事件处理函数(event handler function),也可存储事件,推迟处理。
脚本系统
使用脚本语言,当改动游戏逻辑或数据结构时,无需重新编译、链接,只需修改脚本代码并重新载入即可。
人工智能基础
AI系统中的共有模式:
- 基于A*算法的路径搜寻
- 。。。
个别游戏专用子系统
包括游戏专用渲染、玩家机制、人工智能等。
工具
简单介绍一下各种工具:
- 数字内容创作工具(digital content creation,DCC):制作游戏资产(数据)的软件,如maya、3ds Max、photoshop等。
- 资产调节通道(asset condition pipeline):从DCC、到游戏引擎的管道
- 三维模型/网格数据
- 笔刷几何图形(brush geometry)
- 三维模型(网格)3D model mesh
- 骨骼动画数据(skeletal mesh):特殊网格,动画绑定到骨骼的层次上
- 音频数据(audio clip)
- 粒子系统数据:有专门设计师制作复杂的粒子效果(particle effect)
- 游戏世界数据及世界编辑器(world editor):难写但极重要
emmmm......over