0

0

c++怎么实现一个简单的ECS架构_c++ ECS架构实现方法

尼克

尼克

发布时间:2025-10-03 22:45:02

|

464人浏览过

|

来源于php中文网

原创

答案:通过整数标识实体、类型化组件数组和系统逻辑分离实现轻量级ECS。使用Entity为唯一ID,ComponentArray存储同类组件,ComponentManager按类型管理容器,System遍历所需组件并更新,如MovementSystem结合Position与Velocity实现移动逻辑。

c++怎么实现一个简单的ecs架构_c++ ecs架构实现方法

实现一个简单的ECS(Entity-Component-System)架构,关键在于把数据(组件)和行为(系统)分离,用实体作为唯一标识符来关联组件。C++中可以通过组合数组、哈希表和类型信息来高效实现。下面是一个轻量级、易于理解的ECS实现方法。

1. 实体(Entity)设计

实体只是一个唯一标识符,通常用整数表示,不需要携带任何数据。

typedef uint32_t Entity;
static Entity nextId = 0;
Entity createEntity() { return nextId++; }

每个新创建的实体获得一个递增ID,简单高效。

2. 组件(Component)存储

组件是纯数据结构,比如位置、速度等。我们使用类型化的容器来存储同一类型的组件。

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

template
class ComponentArray {
  std::unordered_map componentMap;
public:
  void add(Entity e, T component) {
    componentMap[e] = component;
  }
  void remove(Entity e) {
    componentMap.erase(e);
  }
  T* get(Entity e) {
    auto it = componentMap.find(e);
    return it != componentMap.end() ? &it->second : nullptr;
  }
};

这里用unordered_map便于快速查找,实际项目中可用连续内存优化性能。

3. 管理组件容器

我们需要一个管理器来统一访问不同类型的组件数组。

lucene技术文档 word版
lucene技术文档 word版

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。 Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免

下载
class ComponentManager {
  std::unordered_map arrays;
public:
  template
  ComponentArray& getArray() {
    size_t typeHash = typeid(T).hash_code();
    auto it = arrays.find(typeHash);
    if (it == arrays.end()) {
      arrays[typeHash] = new ComponentArray();
    }
    return *static_cast*>(arrays[typeHash]);
  }
};

利用typeid获取类型哈希作为键,动态创建对应组件数组。

4. 系统(System)处理逻辑

系统遍历具有特定组件组合的实体并执行操作。例如,一个移动系统:

struct Position { float x, y; };
struct Velocity { float dx, dy; };

void MovementSystem(ComponentManager& cm, float dt) {
  auto& posArray = cm.getArray();
  auto& velArray = cm.getArray();
  // 遍历所有有位置和速度的实体
  for (auto& pair : posArray.componentMap) {
    Entity e = pair.first;
    Position* pos = posArray.get(e);
    Velocity* vel = velArray.get(e);
    if (pos && vel) {
      pos->x += vel->dx * dt;
      pos->y += vel->dy * dt;
    }
  }
}

系统只关心它需要的组件,符合关注点分离原则。

5. 使用示例

int main() {
  ComponentManager cm;
  Entity e1 = createEntity();
  cm.getArray().add(e1, {0.f, 0.f});
  cm.getArray().add(e1, {1.f, 2.f});

  MovementSystem(cm, 0.1f); // 更新0.1秒
  auto* pos = cm.getArray().get(e1);
  printf("New position: %f, %f\n", pos->x, pos->y);
  return 0;
}

这个例子创建了一个带位置和速度的实体,并通过系统更新其状态。

基本上就这些。这个实现虽然简单,但体现了ECS的核心思想:实体是ID,组件是数据,系统是逻辑。后续可扩展支持组件添加/移除事件、实体销毁、内存池优化等。不复杂但容易忽略的是类型安全和性能平衡。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

563

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

99

2025.10.23

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

747

2023.08.22

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

73

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

281

2023.11.28

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

181

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

279

2024.02.23

java标识符合集
java标识符合集

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

254

2025.06.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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