GAMES104-1&2:课程介绍、游戏引擎的层级

前言

GAMES104-1:介绍
GAMES104-2:游戏引擎的层级结构

这节课介绍了什么

  1. 游戏引擎的基础结构:有几层结构?为什么要这样做?
  2. 渲染:我们拿模型、材质、光照、渲染管线……去干些什么?
  3. 动画
  4. 物理
  5. 游戏逻辑(Gameplay)
  6. 其它:特效、寻路、镜头
  7. 工具集:C++ Reflection
  8. 在线游戏
  9. 前沿技术

游戏引擎的结构

由上而下,我们可以简单做如下分层:

  • 工具层:使用引擎的时候,我们就在不断调用各种编辑器:动画编辑器、关卡编辑器、资源管理器……
  • 功能层:物理计算、动画计算、渲染、脚本、镜头、输入……让游戏能看得见、动起来、可以玩
  • 资源层:数据与资源的加载处理。

    不同的资源格式不同需要统一、存储方式对于游戏引擎并不一定是最高效的

  • 核心层:内存管理、线程、进程处理
  • 平台层:OS差异、输入设备、发行平台、图像API……

第三方库、中间件:在每一层都有不同的专精工具,它们如何与游戏引擎配合交流?

以制作一个动画系统为例

资源层的工作:由资源到资产

  • 将资源(resource)转化为资产(asset),舍弃不需要的信息,转化为适合机器处理的格式。

    例如,分层信息、压缩算法导致的不高效

  • GUID:每个资产一个有唯一的身份识别

  • 管理资产的生命周期:不断的加载与卸载、GC

功能层的工作:Tick

让游戏活起来:每一次 tick 计算逻辑和渲染。

  • 逻辑:A 有没有打中 B ?A 要不要向前运动 x 米?
  • 渲染:光照、shader……

功能的多线程问题:

  • 早期:固定数个线程
  • 现代主流:Thread Fork。例如 animation、物理等比较并行的东西用不同线程。
  • 更好:Job system。分为不同的原子任务给任何有空的核心,但是难点是同步。

核心层

  • 数学库

    引擎中相对于精度,更注重速度

  • 数据结构与容器:默认的结构可能不适合游戏。

    例如,c++ vector 容量不够是按倍数扩张

  • 内存管理:宗旨:尽可能放在一起、尽可能顺序访问、尽可能按块读写管理

平台层

  • 其他部分的逻辑应该平台无关
  • 平台差异
    • 图形API:DX11、DX12、Vulkan
    • 硬件不同、甚至文件路径的标记格式

工具层

  • 可用性:让创作者简单地创造
  • DCC(Digital content creation):不同的内外编辑器数据导入导出

为什么要分层

封装解耦:每一层都不需要关心其他层是怎么做事的。只要负责接收处理就好了。

这种解耦的思想在开发过程中时常遇见,分层、接口、消息广播……因为我们总是倾向于各司其职,而不是为了一件小事让所有人大动干戈。