记住“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层设计口诀)
- 数据集中放(Array-of-Struct → Struct-of-Array)
- 顺序访问(Cache-line友好)
- 批量读写/释放(减少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驱动上下分层,越底越稳越顶越活。