Games104-P1-3 基础架构

IMG_0933

IMG_0935

Lecture2 游戏引擎的分层架构

引擎分层

工具层

构成完整游戏生态体系

截屏2023-06-19 14.04.42

  • 引擎内:⬆️
  • 引擎外:DCC

截屏2023-06-19 14.07.37

  • Asset conditioning pipeline:各种import&output
  • 数据间互导需要统一格式

功能层

截屏2023-06-18 20.45.47

截屏2023-06-18 20.46.31

  • Gametick
    • 游戏里的“普朗克时间”,1/30s
    • tickLogic:逻辑帧,对于世界tick内的物理模拟
    • tickRender:渲染帧,tick内进行渲染
  • 区分引擎&游戏的功能代码:功能层提供引擎功能,部分功能隶属游戏而非游戏引擎

截屏2023-06-19 13.28.41

  • 多线程架构:如将tickLogic、tickRender、Render放入三个线程
  • 未来引擎使用多核架构,JOB System更先进,但Dependency的管理困难

资源层

资源层管理游戏运行时,生态资源池的分配;管理资产生命周期

截屏2023-06-18 17.17.33

  • 数据引擎化

    • 原因:DCC生成的文件包含大量无效信息

    • 做法:Importing时,将Sources转为Assets,使用引擎高效数据

  • GUID

    • 资产的唯一识别号,资产的ID
    • 通过XML文件,完成数据间关联

截屏2023-06-18 17.23.33

截屏2023-06-18 20.38.12

  • 运行时资源管理——游戏优化
    • handle系统:和GUID一起负责资产的生命周期。类比GC(垃圾回收)系统。例如切换关卡时,部分资产失效,需要加载新的资产
    • 延迟加载:指的是希望人走到哪,这些资源再加载。例如,玩虚幻引擎做的游戏的时候经常有个细节(不知道最新版本有没有修改):一个角色出现在你的面前,一开始看到那个贴图很模糊,然后一点点变得更清晰

核心层

游戏引擎的基础

截屏2023-06-19 13.34.23

  • 引擎数学库:更适用于引擎,提升效率

截屏2023-06-19 13.44.56

  • 内存管理
    • 尽可能将数据放到一起
    • 数据按顺序排列
    • 数据修改时,一次修改一批而非一个

平台层

截屏2023-06-19 13.56.01

  • 平台无关性

    • 去除平台间差异(系统路径和API)
  • Render Hardware Interface (RHI)

    • 重新定义API,将SDK封装使用以消除差异

为什么引擎要分层

  • 降低复杂度
    • 下层提供基础服务,每一层各司其职
  • 层层封装
    • 底层尽量不改动
    • 底层稳定,上层灵活
    • 上层调用下层功能,下层禁止调用上层功能

Piccolo逻辑

截屏2023-06-20 18.21.36

总结

  1. 游戏引擎架构分层
  2. 底层稳定,上层灵活
  3. tick驱动

Lecture3 如何构建游戏世界

组成

  • Game Object
    • Dynamic 可交互
    • Static
  • 环境

    • Sky
    • Vegetation
    • Terrain
  • Other

    • 截屏2023-06-20 18.48.01

Game Object

属性:Property

行为:Behavior

截屏2023-06-20 18.52.07

继承

  • 截屏2023-06-20 18.53.32
  • 截屏2023-06-20 18.53.52

组件化

适用于,游戏自定义

解决继承中,谁是爷爷(?)的问题

将对象拆分为不同组建

截屏2023-06-20 18.58.30

截屏2023-06-20 19.02.54

组件化后:

截屏2023-06-20 19.03.41

商业引擎中的Component

截屏2023-06-20 19.05.40

如何让世界动起来

Object-based Tick

按照GO,对GO中Component依此进行tick

截屏2023-06-20 19.23.54

Component-based Tick

按照Component,针对一个系统tick

截屏2023-06-20 19.18.00

tick对比

高效的做法——流水线

截屏2023-06-20 19.22.12

事件机制

eg:如何实现爆炸

早期:Hardcode;无法解决复杂游戏世界中问题

截屏2023-06-21 17.11.16

衍生出事件机制;解耦合

截屏2023-06-21 17.12.52

发出Event给到对应的GO,由GO进一步处理

截屏2023-06-21 17.14.07

现代游戏引擎设有自定义机制的接口(add custom event

场景管理

每一个GO都有一个ID,用于被标识和定位

截屏2023-06-21 19.18.31

对于非均匀场景,根据GO分布,进行八叉树(空间)划分

截屏2023-06-21 19.23.29

截屏2023-06-21 19.25.58

总结

截屏2023-06-21 19.28.20

其他需要解决的难题

截屏2023-06-21 19.35.50

  • 绑定:运动联动

    • 父节点先于子节点tick
  • 时序问题

    • eventTick和posTick解决
    • 消息分发,引擎优化
  • 循环依赖(图片左下角

    • 物理和动画互相影响,通过插值处理