GAMES104现代游戏引擎 - 引擎架构分层

文章字数:1432

记住“5+1”层模型与两大驱动神兽。


层级英文关键词典型职责小明“让角色动起来”时要写的代码示例
工具层 Tool Layer编辑器、生产力关卡/材质/蓝图/粒子/音效… 所有DCC导入与可视化编辑用Level Editor把机器人拖进场景,调相机、动画状态机
功能层 Function Layer看得见、动得起来、玩得起来渲染(Render)、动画(Animation)、物理(Physics)、AI/脚本、UI(HUD)TickLogic:读输入→更新骨骼动画;TickRender:提交DrawCall
资源层 Resource Layer资产=高效数据+关系将不同类型的资产转为高效的所需格式 1. 把.max/.psd→引擎Asset(DDS贴图、压缩Mesh);2. 管理GUID、Handle、生命周期、延迟加载、GC写Composite Asset:让“Robot.asset”指向Mesh/Texture/Anim
核心层 Core Layer瑞士军刀数学库(SIMD)、容器(无碎片)、内存池、线程/任务系统、RTTI/反射提供Vec3/Quat运算、高效Queue、内存分配器给上层调用
平台层 Platform Layer一次编写,到处运行封装OS、文件路径、CPU/GPU差异、RHI(DX/Metal/Vulkan抽象)、输入设备实现RHI::CreateBuffer():PC走DX12,Mac走Metal

避免下层中反向调用上层的逻辑,从而导致结构混乱。


两大“神兽”——游戏主循环 每16.67ms(60 FPS)一次 Tick:

  • TickLogic:
    • 读取输入→AI决策→动画骨骼更新→物理碰撞→内存GC→…
    • (无论你看不看得到,世界状态已推进)
  • TickRender:
    • 根据最新状态做裁剪→生成CommandBuffer→GPU执行→呈现画面
    • (纯表现,不影响真实物理/逻辑) → 逻辑与渲染严格分离,方便多线程、录像、网络同步。

资源→资产的生命周期(重点)

原始文件(Resource)
↓ Import/Convert(离线)
引擎资产(Asset):

  • 数据紧凑、GPU友好(如DDS贴图)
  • 带GUID,可重命名/移动不丢失引用
  • Composite Asset 描述关联关系(Mesh+Mat+Anim)

    运行时 Handle 系统 + Asset Manager:
  • 延迟加载、引用计数、异步卸载
  • 关卡切换时避免“卡顿”与“爆内存”

多线程与Job系统演进

单线程→Logic/Render双线程→功能模块线程(Physics/Animation)→全Job化(Task Graph)
关键:识别依赖(Dependency),建立DAG,把任务拆成原子Job喂满所有核。


内存三条金律(Core层设计口诀)

  1. 数据集中放(Array-of-Struct → Struct-of-Array)
  2. 顺序访问(Cache-line友好)
  3. 批量读写/释放(减少malloc/free,用Pool)

平台层易忽略陷阱

  • 文件路径分隔符、大小写、编码
  • 不同CPU架构(x86/ARM、大小核、SPU)
  • 图形API差异→RHI抽象
  • 输入设备(键鼠、手柄、方向盘、Kinect…)

工具层 = 生产力

  • 自研:Level Editor、Material Editor、Blueprint…
  • DCC链:Max/Maya/PS/Houdini → Export Plugin → Asset Conditioning Pipeline → 引擎
  • 统一数据格式(FBX→USD?)仍无绝对标准,多数引擎自建。

引擎=⑤工具④功能③资源②核心①平台,Tick驱动上下分层,越底越稳越顶越活。

视频地址:引擎架构分层 | GAMES104-现代游戏引擎:从入门到实践

本文包含一些 AIGC 辅助生成内容,由作者人工校对整理后发布
该内容采用 CC BY-NC-SA 4.0许可协议。如果对您有帮助或存在意见建议,欢迎在下方评论交流。
本页面浏览次数 加载中...
本页面访客数 加载中...

加载中...