c++如何实现一个简单的ECS架构_c++游戏开发实体组件系统【设计模式】


ECS架构核心是实体为纯ID、组件为POD数据、系统为无状态函数;Entity是uint32_t包装,Component用连续vector存储并按ID对齐,System直接遍历对应数组执行逻辑,World统一管理生命周期与调度。

c++如何实现一个简单的ecs架构_c++游戏开发实体组件系统【设计模式】

用C++实现一个简单的ECS(Entity-Component-System)架构,核心是把数据(Component)和逻辑(System)彻底分离,实体(Entity)只作为ID存在。不依赖复杂模板或宏,也能写出清晰、可扩展、缓存友好的基础版本。

实体:轻量ID,不存数据

Entity 就是一个无符号整数(如 uint32_t),用于唯一标识一个游戏对象。它本身不包含任何成员变量,也不继承任何类——避免虚函数开销和内存碎片。

可以加一层简单包装防止误用:

struct Entity {
    uint32_t id;
    explicit Entity(uint32_t i) : id(i) {}
    bool operator==(const Entity& other) const { return id == other.id; }
};

组件:纯数据结构,无逻辑

Component 是 POD(Plain Old Data)类型:只有 public 成员变量,没有虚函数、构造/析构逻辑、指针或 STL 容器(避免非连续内存)。例如:

立即学习“C++免费学习笔记(深入)”;

struct Position {
    float x = 0.f, y = 0.f;
};
<p>struct Velocity {
float dx = 0.f, dy = 0.f;
};</p><p>struct Renderable {
const char* texture_name = nullptr;
};</p>

关键点:

  • 每个组件类型对应一个独立的 std::vector(即“组件数组”),保证内存连续
  • vector 下标与 Entity ID 对齐(例如 entity.id == 5,则 Position[5] 就是它的位置)
  • 空槽位用特殊值(如 -1)或单独的活跃标志位管理,避免 vector 删除导致 ID 错位

系统:遍历匹配组件,执行逻辑

System 不持有 Entity 或 Component 实例,只在运行时按需访问组件数组。例如移动系统:

struct MovementSystem {
    std::vector<Position>& positions;
    std::vector<Velocity>& velocities;
<pre class='brush:php;toolbar:false;'>void update(float dt) {
    size_t n = std::min(positions.size(), velocities.size());
    for (size_t i = 0; i < n; ++i) {
        positions[i].x += velocities[i].dx * dt;
        positions[i].y += velocities[i].dy * dt;
    }
}

};

Fotor AI Image Upscaler Fotor AI Image Upscaler

Fotor推出的AI图片放大工具

Fotor AI Image Upscaler 73 查看详情 Fotor AI Image Upscaler

实际中可用标签(Tag)或位掩码(Archetype)加速查询,但最简版直接遍历对齐数组即可。

系统之间无依赖顺序,靠手动调用顺序控制(如先 update Input → Movement → Collision → Render)。

世界(World):统一管理容器与生命周期

World 是 ECS 的调度中心,负责:

  • 分配/回收 Entity ID(用 freelist 或 atomic counter)
  • 按类型维护组件存储(如 std::unordered_map> + 类型擦除,或模板化 registry)
  • 提供 add_component/remove_component/get_component 接口
  • 持有所有 System 并提供 update() 入口

简易 registry 示例(不依赖 type_index):

template<typename T>
struct ComponentStorage {
    std::vector<T> data;
    std::vector<bool> alive; // 标记该槽是否有效
<pre class='brush:php;toolbar:false;'>void grow_to(size_t n) {
    if (data.size() < n) {
        data.resize(n);
        alive.resize(n, false);
    }
}

T& get(Entity e) { return data[e.id]; }
void set(Entity e, const T& v) {
    grow_to(e.id + 1);
    data[e.id] = v;
    alive[e.id] = true;
}

};

struct World { ComponentStorage positions; ComponentStorage velocities; // ... 其他组件

Entity create_entity() {
    // 简单线性分配(生产环境建议 freelist)
    return Entity(next_id++);
}

void update(float dt) {
    movement_system.update(dt);
    // ...
}

private: uint32_t next_id = 0; MovementSystem movement_system{positions.data, velocities.data}; };

基本上就这些。不需要反射、不强制用宏、不绑定特定框架——C++11 起就能写。重点是守住“组件即数据、系统即函数、实体即ID”的边界,后续再按需加入 archetype、事件总线、多线程任务调度等增强特性。

以上就是c++++如何实现一个简单的ECS架构_c++游戏开发实体组件系统【设计模式】的详细内容,更多请关注其它相关文章!


# 就能  # 如何做外贸网站优化工作  # 网站建设不断优化  # 怎样精准推广网站  # 公益网站推广的方法  # 四川网站建设软件  # 三明网站制作推广平台官网  # 西安 房产网站建设  # 淄博全网seo公司地址  # 广州市优化网站  # 菏泽网站推广定制公司  # 不需要  # ai  # 也不  # 边缘  # 不依赖  # 多线程  # 数据结构  # 遍历  # 如何实现  # red  # 游戏开发  # c++ 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口  j*a中赋值运算符是什么?  《花瓣》创建专辑方法  PHP中获取HTTP响应状态消息:方法与限制  微博网页版入口链接 微博网页版在线互动平台  易车网官网直达入口 易车网在线登录入口  J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明  无人机考证官网 中国民航无人机考证官网登录入口  精通VS Code多光标编辑以实现闪电般快速的修改  中大网校app做题记录清除方法  《edge浏览器》关闭翻译功能方法  《广发易淘金》国债逆回购操作教程  mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法  如何在CSS中使用伪类选择器_hover实现悬停效果  PHP与SQL实践:高效实现数据复制与特定列值修改  PSD转AI文件的简单方法  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  《大润发优鲜》充值方法介绍  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  byrutor直接访问入口 byrutor官方游戏库  冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤  《红果免费短剧》下载观看方法  小红书网页版在线直达 小红书网页版免费登录入口  晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制  海外搜索引擎推广效果怎么样,怎么分析效果!  RxJS中如何高效地在一个函数内处理和合并多个数据集合  怎么恢复删除的电脑文件_数据恢复软件使用教程  多多买菜门店端app订单查看方法  电脑开不了机怎么办 电脑无法开机的解决方法  《sketchbook》选中部分图案移动方法  抖音作品被限流怎么办 抖音内容优化与流量恢复方法  TikTok网页版入口快速访问 TikTok官网账号登录方法  《360浏览器》设置摄像头权限方法  QQ网站入口直接登录 QQ官方正版登录页面  126手机126邮箱登录_126邮箱手机登录入口官网  《跳跳舞蹈》循环播放方法  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  2025考研成绩查询时间入口分享  谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法  在VS Code中进行数据科学和机器学习开发  Excel宏怎么删除_Excel中删除宏的详细操作流程  ao3入口镜像地址 ao3镜像入口可靠跳转  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  Linux如何自动分析系统异常日志_Linux日志智能检测  Composer如何使用composer-plugin-api开发自定义插件 

 2025-12-18

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.