0

0

c++如何实现一个简单的ECS c++游戏实体组件系统【架构】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-08 08:01:37

|

541人浏览过

|

来源于php中文网

原创

ECS用数据驱动替代继承:Entity为带版本号的轻量ID,Component为纯数据,System处理组件组合;C++中通过编译期优化避免虚函数与指针跳转,提升内存友好性与复用性。

c++如何实现一个简单的ecs c++游戏实体组件系统【架构】

核心设计原则:用数据驱动代替继承

传统面向对象游戏架构常依赖深度继承树,比如 GameObject → Character → Player,导致逻辑耦合、复用困难、内存不友好。ECS(Entity-Component-System)反其道而行:实体(Entity)只是唯一ID,组件(Component)纯数据,系统(System)专注处理特定组件组合。C++中实现的关键是把运行时多态转为编译期/数据布局优化,避免虚函数和指针跳转。

实体(Entity):轻量ID,不存数据

Entity 不该是类,而应是紧凑、可快速比较/哈希的整数(如 uint32_t 或 uint64_t)。推荐用带版本号的稀疏索引(如 entity = (index ),防止悬挂引用。实际代码中可封装为:

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

所有实体共用一个全局连续池(如 std::vector alive),增删只改标志位,不移动内存。

组件(Component):POD结构,按需存储

每个组件必须是平凡类型(trivially copyable),不含虚函数、引用、非静态成员函数。例如:

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

DeepL
DeepL

DeepL是一款强大的在线AI翻译工具,可以翻译31种不同语言的文本,并可以处理PDF、Word、PowerPoint等文档文件

下载
struct Position {
    float x = 0.f, y = 0.f;
};

struct Velocity { float dx = 0.f, dy = 0.f; };

struct Renderable { std::string sprite_name; bool visible = true; };

组件不挂载在实体上,而是由系统按类型集中管理。典型做法是为每种组件维护一个 std::vector(SoA 或 AoS 均可,初学者建议 AoS),并用 Entity ID 映射到 vector 下标(如用 std::vector entity_to_index 或更高效的稀疏数组)。

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

System 是普通类或函数对象,不持有状态,只在帧更新时运行。关键在于如何高效查出同时拥有 Position 和 Velocity 的实体。简单可靠的做法是:

  • 每个系统声明所需组件类型(如 requires
  • 维护一份“该系统关心的实体ID列表”,在组件添加/移除时动态更新(事件驱动或脏标记)
  • 运行时直接遍历这个ID列表,用ID查对应组件数据(O(1)随机访问)

示例更新逻辑:

void MovementSystem::update(World& world) {
    for (auto entity : m_entities) {
        auto& pos = world.get(entity);
        auto& vel = world.get(entity);
        pos.x += vel.dx * dt;
        pos.y += vel.dy * dt;
    }
}

进阶可引入 archetype(组件类型组合)或 chunk(批量内存块)提升缓存友好性,但简单项目用 vector + ID映射已足够清晰高效。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

49

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

34

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号