拆解结构——系统架构怎么组织:引擎/游戏/子系统/组件

一句话

拆解结构 = 回答四个问题:程序由哪些角色组成、每个角色内部怎么组织、组件边界在哪、组装权在谁手里。


一、结构拆解四层

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?)
依赖方向是否单向?(引擎不依赖游戏,游戏依赖引擎)

与其他线的关系

  • 与游戏三条线:本线的「子系统/组件/组装」三问就是引擎组装、游戏组件、组件组装三条线的浓缩
  • 与系统角色主题:角色拆解(入口/业务/支撑)继承自系统角色主题——游戏只是把「业务系统」换成「游戏系统」
  • 与拆解与组织主题:结构拆解就是拆解与组织原则在游戏上的直接应用
  • 与从指令到系统主线:引擎不依赖游戏、游戏依赖引擎 = 分层后的单向依赖约束