0

0

c++如何实现一个简单的ECS架构_c++游戏开发中的实体组件系统

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-03 15:52:17

|

1007人浏览过

|

来源于php中文网

原创

ECS架构通过实体、组件、系统分离数据与逻辑,提升性能与可扩展性:1. 实体为唯一ID,组件为纯数据,系统处理特定组件组合;2. 组件用类型索引容器存储,ComponentManager统一管理;3. 系统如MovementSystem遍历含Position和Velocity的实体更新位置;4. World类封装创建、添加、更新操作,简化使用。示例展示玩家移动逻辑,虽省略优化但仍体现核心思想。

c++如何实现一个简单的ecs架构_c++游戏开发中的实体组件系统

在C++游戏开发中,ECS(Entity-Component-System)是一种高效、灵活的架构模式,适合处理大量动态对象。它将数据与行为分离,提升缓存友好性和可扩展性。下面是一个简化但实用的ECS实现思路,帮助你快速上手。

1. 核心概念:实体、组件、系统

ECS由三部分组成:

  • 实体(Entity):只是一个唯一ID,代表游戏中的一个对象,比如玩家、敌人。
  • 组件(Component):纯数据结构,描述实体的某方面状态,如位置、血量。
  • 系统(System):处理具有特定组件组合的实体,执行逻辑,如移动、渲染。

这种设计避免了继承带来的复杂性,通过组合实现灵活性。

2. 实现组件存储

组件通常用类型索引的容器管理。我们可以用std::unordered_map按类型存储组件集合:

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

class ComponentArrayBase {
public:
    virtual ~ComponentArrayBase() = default;
};

template class ComponentArray : public ComponentArrayBase { public: void Add(Entity entity, T component) { m_ComponentMap[entity] = component; }

void Remove(Entity entity) {
    m_ComponentMap.erase(entity);
}

T& Get(Entity entity) {
    return m_ComponentMap[entity];
}

private: std::unordered_map m_ComponentMap; };

再用一个管理器统一访问:

class ComponentManager {
public:
    template
    void RegisterComponent() {
        const char* typeName = typeid(T).name();
        m_ComponentArrays[typeName] = std::make_unique>();
    }
templatezuojiankuohaophpcntypename Tyoujiankuohaophpcn
void AddComponent(Entity entity, T component) {
    GetComponentArrayzuojiankuohaophpcnTyoujiankuohaophpcn()-youjiankuohaophpcnAdd(entity, component);
}

templatezuojiankuohaophpcntypename Tyoujiankuohaophpcn
T& GetComponent(Entity entity) {
    return GetComponentArrayzuojiankuohaophpcnTyoujiankuohaophpcn()-youjiankuohaophpcnGet(entity);
}

private: template ComponentArray GetComponentArray() { const char typeName = typeid(T).name(); auto it = m_ComponentArrays.find(typeName); return static_cast*>(it->second.get()); }

std::unordered_mapzuojiankuohaophpcnconst char*, std::unique_ptrzuojiankuohaophpcnComponentArrayBaseyoujiankuohaophpcnyoujiankuohaophpcn m_ComponentArrays;

};

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

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

下载

3. 实体管理与系统执行

实体可以用简单的整型表示:

using Entity = uint32_t;

系统遍历具有指定组件的实体。例如,一个移动系统:

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

class MovementSystem { public: void Update(ComponentManager& cm, float dt) { // 获取所有有Position和Velocity的实体(简化版:需配合实体-组件关系) // 实际中可用位掩码或查询机制 for (auto& [entity, pos] : cm.GetComponents()) { if (cm.HasComponent(entity)) { auto& vel = cm.GetComponent(entity); pos.x += vel.dx dt; pos.y += vel.dy dt; } } } };

4. 简化使用方式

可以封装一个World类整合管理:

class World {
public:
    Entity CreateEntity() {
        return ++m_EntityCounter;
    }
templatezuojiankuohaophpcntypename Tyoujiankuohaophpcn
void AddComponent(Entity entity, T component) {
    m_ComponentManager.AddComponent(entity, component);
}

templatezuojiankuohaophpcntypename Tyoujiankuohaophpcn
T& GetComponent(Entity entity) {
    return m_ComponentManager.GetComponentzuojiankuohaophpcnTyoujiankuohaophpcn(entity);
}

void RunMovement(float dt) {
    m_MovementSystem.Update(m_ComponentManager, dt);
}

private: Entity m_EntityCounter = 0; ComponentManager m_ComponentManager; MovementSystem m_MovementSystem; };

使用示例:

World world;
Entity player = world.CreateEntity();
world.AddComponent(player, Position{0, 0});
world.AddComponent(player, Velocity{1.0f, 0.5f});

world.RunMovement(0.02f); // 更新20ms

基本上就这些。这个版本省略了组件查询优化和内存连续性(如SoA布局),但足够理解ECS核心思想。后续可引入位掩码过滤、组件池、多线程系统等进阶特性。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

524

2023.09.20

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

535

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

20

2026.01.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

81

2023.11.23

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

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

68

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

127

2026.01.16

热门下载

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

精品课程

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

共94课时 | 7万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.8万人学习

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

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