拆解结构——系统架构怎么组织:引擎/游戏/子系统/组件
一句话
拆解结构 = 回答四个问题:程序由哪些角色组成、每个角色内部怎么组织、组件边界在哪、组装权在谁手里。
一、结构拆解四层
1 2 3 4
| 第一层:角色 入口 / 引擎 / 游戏 / 基础设施(谁是支撑、谁是业务) 第二层:子系统 引擎有哪些子系统(渲染/物理/输入/音频/资源/场景) 第三层:组件 每个子系统有哪些组件(数据+算法+接口) 第四层:组装 谁负责把组件拼起来(GameApplication / Composition Root)
|
二、角色拆解:Engine vs Game
1 2 3
| 游戏程序 ├── Engine(支撑子系统) ECS / Rendering / Physics / Input / Audio / Resource / Scene └── Game(业务子系统) Player / Enemy / Weapon / Character / Inventory / Quest / GameRule
|
Engine Component 和 Game Component 在「组件化」层面没有区别。 区别只是:Engine Component 支撑游戏,Game Component 实现具体游戏。
三、子系统拆解清单
引擎可能包含的子系统:
1 2 3 4 5 6 7 8 9 10 11
| 渲染系统(GPU/Draw Call/渲染管线) 物理系统(碰撞/刚体/约束) 音频系统(声音/3D音效/混音) 输入系统(键盘/鼠标/手柄/触摸) 资源系统(加载/缓存/异步/引用计数) 场景系统(场景图/节点/摄像机) 脚本系统(Lua/Python 绑定) UI 系统(控件树/事件/布局) 动画系统(骨骼动画/状态机/混合) 粒子系统(发射/更新/渲染) 网络系统(同步/预测/回滚)
|
四、组件拆解清单
游戏系统可能包含的组件:
1 2 3 4 5 6 7 8 9
| 玩家控制组件(输入映射/角色控制/相机跟随) AI 组件(寻路/状态机/行为树) 战斗组件(攻击判定/伤害计算/Buff) 物品组件(背包/装备/使用/掉落) 关卡组件(关卡加载/触发器/脚本事件) 对话组件(对话树/选项/分支) 存档组件(保存/加载/序列化) UI 组件(HUD/菜单/对话框) 音效组件(环境音/技能音效/BGM)
|
五、组装拆解:谁来组装
1 2 3 4 5 6 7 8 9 10 11
| int main() { GameApplication app; app.run(); }
class GameApplication { void run() { Engine engine; Game game; game.registerComponents(engine); game.registerSystems(engine); engine.run(); } };
|
运行时路径:
1
| GameApplication → Engine → Scheduler → Game Systems → ECS World → Game Components
|
六、结构拆解清单(对已有游戏)
1 2 3 4 5
| 程序有哪些角色?(入口/引擎/游戏/基础设施) 引擎有哪些子系统?哪些框架化、哪些接口化? 游戏有哪些组件?组件和引擎子系统的边界在哪? 谁负责组装?(GameApplication?main?) 依赖方向是否单向?(引擎不依赖游戏,游戏依赖引擎)
|
与其他线的关系
- 与游戏三条线:本线的「子系统/组件/组装」三问就是引擎组装、游戏组件、组件组装三条线的浓缩
- 与系统角色主题:角色拆解(入口/业务/支撑)继承自系统角色主题——游戏只是把「业务系统」换成「游戏系统」
- 与拆解与组织主题:结构拆解就是拆解与组织原则在游戏上的直接应用
- 与从指令到系统主线:引擎不依赖游戏、游戏依赖引擎 = 分层后的单向依赖约束