Entity是uint32_t ID,无数据无虚函数;Component为POD结构体,纯数据无逻辑;System只声明所需组件类型,由World按签名筛选实体并调用update;World统一管理生命周期、存储与调度。

用C++实现一个简单的ECS(Entity-Component-System)架构,核心是把数据(Component)和逻辑(System)彻底分离,Entity只作为ID存在。不需要复杂模板或宏,从零开始也能写出清晰、可扩展的版本。
Entity:轻量ID,不存任何数据
Entity本质就是一个整数ID(比如uint32_t),用于关联组件。避免用类包装,防止误加成员或虚函数破坏纯数据性。
- 用连续递增ID(配合回收池)管理生命周期,避免ID爆炸
- 不继承、不虚函数、不存储指针——只是一个“标签”
- 示例:using Entity = uint32_t;,配合Entity null_entity = 0;表示无效
Component:纯数据结构,无函数无继承
每个Component是POD(Plain Old Data)结构体,只含字段,不带方法、不依赖其他组件、不涉及内存管理逻辑。
- 例如:struct Position { float x, y; };、struct Velocity { float dx, dy; };
- 所有Component类型在编译期注册(如用类型索引映射到数组下标),便于系统快速定位
- 组件存储推荐用SoA(Structure of Arrays)或紧密打包的AoS(Array of Structs),优先考虑缓存友好性
System:按需遍历,专注逻辑
System不持有Entity或Component,只声明它需要哪些Component类型(如“处理所有同时拥有Position和Velocity的Entity”),运行时由World调度匹配的实体集合。
立即学习“C++免费学习笔记(深入)”;
- 每个System重载void update(float dt),内部用迭代器或索引批量访问对应组件数组
- World负责维护组件容器(如std::vector
)、建立Entity→Component索引(如稀疏数组或哈希表) - 避免在System里做动态内存分配;更新顺序由开发者显式控制(如先VelocitySystem,再PositionSystem)
World:协调者,不参与业务逻辑
World是ECS的中枢,管理Entity生命周期、组件存储、System注册与执行。它本身不包含游戏规则,只提供createEntity()、addComponent
- 组件容器可用std::array<:unique_ptr>, MAX_COMPONENT_TYPES>统一管理不同类型
- Entity到组件的映射可用std::vector<:array max_component_types>>(稀疏索引)或更紧凑的位掩码+间接索引
- System执行时,World按签名(如Signature{has
(), has )筛选出匹配Entity列表,传给对应System()}
基本上就这些。不需要反射、不强求完美解耦,先跑通“添加组件→写System→World驱动”闭环,再逐步优化内存布局和查询性能。ECS的价值不在炫技,而在让数据可见、逻辑可测、变更可控。









