skypjack/entt

GitHub: skypjack/entt

一款高性能的现代 C++ 实体组件系统库,提供 ECS 核心功能及反射、信号、资源管理等扩展工具集。

Stars: 12368 | Forks: 1064

![EnTT: 游戏开发遇上现代 C++](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/7faaaf725d062421.png) [![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/a47faf3a53062422.svg)](https://github.com/skypjack/entt/actions) [![覆盖率](https://codecov.io/gh/skypjack/entt/branch/master/graph/badge.svg)](https://codecov.io/gh/skypjack/entt) [![在线体验](https://img.shields.io/badge/try-online-brightgreen)](https://godbolt.org/z/zxW73f) [![文档](https://img.shields.io/badge/docs-doxygen-blue)](https://skypjack.github.io/entt/) [![Vcpkg 端口](https://img.shields.io/vcpkg/v/entt)](https://vcpkg.link/ports/entt) [![Conan Center](https://img.shields.io/conan/v/entt)](https://conan.io/center/recipes/entt) [![Gitter 聊天](https://badges.gitter.im/skypjack/entt.png)](https://gitter.im/skypjack/entt) [![Discord 频道](https://img.shields.io/discord/707607951396962417?logo=discord)](https://discord.gg/5BjPWBd) `EnTT` 是一个仅头文件、小巧且易于使用的库,用于游戏编程以及更多用 **现代 C++** 编写的领域。
[其中](https://github.com/skypjack/entt/wiki/EnTT-in-Action),它被 Mojang 的 [**Minecraft**](https://minecraft.net/en-us/attribution/)、 Esri 的 [**ArcGIS Runtime SDKs**](https://developers.arcgis.com/arcgis-runtime/) 以及令人惊叹的 [**Ragdoll**](https://ragdolldynamics.com/) 所使用。
如果您没有在列表中看到您的项目,请开启一个 issue,提交一个 PR 或 将 [\#entt](https://github.com/topics/entt) 标签添加到您的 _topics_ 中! :+1: # 目录 * [简介](#introduction) * [代码示例](#code-example) * [动机](#motivation) * [基准测试](#benchmark) * [集成](#integration) * [要求](#requirements) * [CMake](#cmake) * [Natvis 支持](#natvis-support) * [打包工具](#packaging-tools) * [pkg-config](#pkg-config) * [文档](#documentation) * [测试](#tests) * [EnTT 实战](#entt-in-action) * [贡献者](#contributors) * [许可证](#license) # 简介 实体-组件-系统(也称为 _ECS_)是一种主要用于游戏开发的架构模式。更多详情请参阅: * [实体系统 Wiki](http://entity-systems.wikidot.com/) * [演进你的层次结构](http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/) * [维基百科上的 ECS](https://en.wikipedia.org/wiki/Entity%E2%80%93component%E2%80%93system) 这个项目最初是作为一个纯粹的实体-组件系统开始的。随着时间的推移,随着添加了越来越多的类和功能,代码库不断增长。
以下是它如今提供的简要但非完整的列表: * 内置的 **RTTI 系统**,与标准系统非常相似。 * 一个用于人类可读 **资源名称** 的 `constexpr` 实用工具。 * 使用单态模式构建的最小 **配置系统**。 * 极快的 **实体-组件系统**,拥有自己的 _按需付费_ 策略,不受限制的组件类型具有可选的指针稳定性和用于存储自定义的钩子。 * 视图和组,用于迭代实体和组件,并允许不同的访问模式,从 **完美的 SoA** 到完全随机。 * 许多建立在实体-组件系统之上的 **设施**,以帮助用户避免重复造轮子。 * 用于最佳调度的通用 **执行图构建器**。 * 有史以来最小、最基础的 **服务定位器** 实现。 * 内置的、非侵入式的且无宏的运行时 **反射系统**。 * 简单易用的 **静态多态**。 * 一些自制的容器,例如基于稀疏集的 **哈希映射**。 * 用于任何类型进程的 **协作调度器**。 * **资源管理** 所需的一切(缓存、加载器、句柄)。 * 委托、**信号处理程序** 和一个小型事件分发器。 * 一个通用的 **事件发射器**,作为基于 CRTP 惯用法的类模板。 * 还有 **更多**!请查看 [**wiki**](https://github.com/skypjack/entt/wiki)。 请将此列表视为正在进行的工作以及项目本身。整个 API 都在代码中进行了完整的文档记录,供那些有勇气阅读它的人参考。
请注意,所有工具现在也都是 DLL 友好的,并且可以跨边界顺利运行。 大多数人知道的一件事是 `EnTT` 也被用于 **Minecraft** 中。
鉴于这款游戏几乎可以在任何地方运行,我可以自信地说,该库已经在所有能想到的平台上进行了充分的测试。 ## 代码示例 ``` #include struct position { float x; float y; }; struct velocity { float dx; float dy; }; void update(entt::registry ®istry) { auto view = registry.view(); // use a callback view.each([](const auto &pos, auto &vel) { /* ... */ }); // use an extended callback view.each([](const auto entity, const auto &pos, auto &vel) { /* ... */ }); // use a range-for for(auto [entity, pos, vel]: view.each()) { // ... } // use forward iterators and get only the components of interest for(auto entity: view) { auto &vel = view.get(entity); // ... } } int main() { entt::registry registry; for(auto i = 0u; i < 10u; ++i) { const auto entity = registry.create(); registry.emplace(entity, i * 1.f, i * 1.f); if(i % 2 == 0) { registry.emplace(entity, i * .1f, i * .1f); } } update(registry); } ``` ## 动机 我开始开发 `EnTT` 是出于一个 _错误_ 的原因:我的目标是设计一个实体-组件系统,在性能和可能的内存使用方面击败另一个知名的开源库。
最后,我做到了,但这并不令人满意。实际上,这根本不令人满意。只是最快而已,除此之外相当少。当我意识到这一点时,我努力保持 `EnTT` 的出色性能,同时在 *我自己的库* 中添加我希望看到的所有功能。 如今,`EnTT` 终于成为了我一直在寻找的东西:仍然比其 _竞争对手_ 更快,平均情况下内存使用率更低,一个非常好的 API 和一系列惊人的功能。当然,还有更多。 ## 基准测试 就其价值而言,您 **永远** 不会看到我试图让其他项目看起来很糟糕,或者提供可疑的比较只是为了让这个库看起来更酷。
我将这项活动留给其他人,如果他们喜欢的话(而且似乎有些人确实喜欢这样做)。我更愿意更好地利用我的时间。 如果您感兴趣,您可以通过将 `CMake` 的 `ENTT_BUILD_BENCHMARK` 选项设置为 `ON`,在发布模式下(以启用编译器优化,否则意义不大)编译 `benchmark` 测试,然后自己评估是否对结果满意。 还有很多项目使用 `EnTT` 作为比较的基础(这本身就应该告诉您很多信息)。其中许多基准测试是完全错误的,许多其他则根本不完整,善于省略某些信息并使用错误的函数来比较特定功能。当然也有好的,但如果没有人更新它们,它们很快就会过时,尤其是当它们处理的库正在积极开发时。
在所有项目中,[这个](https://github.com/abeimler/ecs_benchmark) 似乎是 最新的项目,并且也涵盖了相当数量的库。 我不能确切地说 `EnTT` 是否被正确使用。但是,即使使用不当,它仍然应该让读者对其运行情况有一个大致的了解。 # 集成 `EnTT` 是一个仅头文件的库。这意味着包含 `entt.hpp` 头文件就足以包含整个库并使用它。对于那些只对实体-组件系统感兴趣的人,请考虑仅包含 `entity/registry.hpp` 头文件。
只需在文件顶部添加以下行: ``` #include ``` 使用下面的行来仅包含实体-组件系统: ``` #include ``` 然后将适当的 `-I` 参数传递给编译器,以将 `src` 目录添加到包含路径中。 ## 要求 为了能够使用 `EnTT`,用户必须提供一个支持至少 C++20 的功能齐全的编译器。
以下要求是编译测试和提取文档所必需的: * `CMake` 3.28 或更高版本。 * `Doxygen` 1.14 或更高版本。 或者,也支持 [Bazel](https://bazel.build) 作为构建系统 (归功于 [zaucy](https://github.com/zaucy),他主动提出维护它)。
在下面的文档中,我仍然会参考 `CMake`,因为它是库的官方构建系统。 ## CMake 要从 `CMake` 项目中使用 `EnTT`,只需将现有目标链接到 `EnTT::EnTT` 别名。 该库提供了您需要的所有功能,用于定位(如 `find_package`)、嵌入(如 `add_subdirectory`)、获取(如 `FetchContent`)或以您能想到的许多涉及 `CMake` 的方式使用它。
涵盖所有可能的情况需要一篇论文而不是一个简单的 README 文件,但我相信阅读本节的人都知道它是关于什么的,并且可以毫无问题地从 `CMake` 项目中使用 `EnTT`。 请注意,所有 `install` 调用都由 `ENTT_INSTALL` 选项保护,以允许将 `EnTT` 用作子模块而不会与用户逻辑冲突。
因此,必须将该选项设置为 true,才能利用此库提供的安装逻辑。 ## Natvis 支持 使用 `CMake` 时,只需启用 `ENTT_INCLUDE_NATVIS` 选项即可享受它。
否则,大多数工具都通过 Natvis 覆盖,所有文件都可以在 `natvis` 子目录中找到,按模块划分。
如果您发现错误或有建议,欢迎任何贡献! ## 打包工具 `EnTT` 可用于一些最知名的打包工具。特别是: * [`Conan`](https://github.com/conan-io/conan-center-index),面向开发者的 C/C++ 包管理器。 * [`vcpkg`](https://github.com/Microsoft/vcpkg),Microsoft VC++ 打包工具。
您只需几个简单的步骤即可下载并安装 `EnTT`: $ git clone https://github.com/Microsoft/vcpkg.git $ cd vcpkg $ ./bootstrap-vcpkg.sh $ ./vcpkg integrate install $ vcpkg install entt 或者您可以使用 `experimental` 功能来测试最新的更改: vcpkg install entt[experimental] --head `vcpkg` 中的 `EnTT` 端口由 Microsoft 团队成员和社区贡献者保持最新。
如果版本过时,请在 `vcpkg` 仓库中 [创建 issue 或拉取请求](https://github.com/Microsoft/vcpkg)。 * [`Homebrew`](https://github.com/skypjack/homebrew-entt),macOS 上缺失的包管理器。
以 Homebrew formula 的形式提供。只需输入以下命令即可安装: brew install skypjack/entt/entt * [`build2`](https://build2.org),用于开发和打包 C 和 C++ 代码的构建工具链。
为了在 `build2` 项目中使用 [`entt`](https://cppget.org/entt) 包,请将以下行或类似内容添加到 `manifest` 文件中: depends: entt ^3.0.0 还要检查配置是否指向有效的仓库,以便 `build2` 可以找到该包: * [`cppget.org`](https://cppget.org),开源社区中央仓库,访问地址为 `https://pkg.cppget.org/1/stable`。 * [包源仓库](https://github.com/build2-packaging/entt): 访问地址为 `https://github.com/build2-packaging/entt.git` 或 `ssh://git@github.com/build2-packaging/entt.git`。 请随时 [报告此包的](https://github.com/build2-packaging/entt) 问题。 两者都可以与 `bpkg add-repo` 一起使用,或添加到项目的 `repositories.manifest` 中。请参阅官方 [文档](https://build2.org/build2-toolchain/doc/build2-toolchain-intro.xhtml#guide-repositories) 了解更多详情。 * [`bzlmod`](https://bazel.build/external/overview#bzlmod),Bazel 的外部依赖管理系统。
要在 `bazel` 项目中使用 [`entt`](https://registry.bazel.build/modules/entt) 模块,请将以下内容添加到您的 `MODULE.bazel` 文件中: bazel_dep(name = "entt", version = "3.16.0") EnTT 现在将作为 `@entt`(`@entt//:entt` 的简称)提供,可在您的 `cc_*` 规则 `deps` 中使用。 请将此列表视为正在进行的工作,如果您愿意,请帮助我使其变得更长。 ## pkg-config `EnTT` 也支持 `pkg-config`(至少在某种定义上是如此)。 运行 `CMake` 时,会生成一个名为 `entt.pc` 的合适文件并将其安装在适当的目录中。
这也应该使其更容易与 `Meson` 或类似工具一起使用。 # 文档 文档基于 [doxygen](http://www.doxygen.nl/)。要构建它: ``` $ cd build $ cmake .. -DENTT_BUILD_DOCS=ON $ make ``` API 参考以 HTML 格式创建在 `build/docs/html` 目录中。 要使用您喜欢的浏览器浏览它: ``` $ cd build $ your_favorite_browser docs/html/index.html ``` 相同版本也可 [在线](https://skypjack.github.io/entt/) 获取 对于最新版本,即最后一个稳定标签。
此外,还有一个专门针对该项目的 [wiki](https://github.com/skypjack/entt/wiki),用户可以在其中找到所有相关的文档页面。 # 测试 要编译和运行测试,`EnTT` 需要 *googletest*。
`cmake` 会在编译其他任何内容之前下载并编译该库。为了构建测试,请将 `CMake` 选项 `ENTT_BUILD_TESTING` 设置为 `ON`。 要构建最基础的测试集: * `$ cd build` * `$ cmake -DENTT_BUILD_TESTING=ON ..` * `$ make` * `$ make test` 请注意,基准测试不在此集合中。 # EnTT 实战 `EnTT` 被广泛用于私人及商业应用程序中。由于之前在一些文件上签了名,我甚至无法提及其中大部分。幸运的是,也有些人花时间实现了基于 `EnTT` 的开源项目,并且在记录文档方面毫不吝啬。 [这里](https://github.com/skypjack/entt/wiki/EnTT-in-Action) 您可以找到一个 不完整的游戏、应用程序和文章列表,可用作参考。 如果您知道其他关于 `EnTT` 的资源,请随时开启一个 issue 或 PR,我很乐意将它们添加到列表中。 # 许可证 代码和文档版权所有 (c) 2017-2026 Michele Caini。
彩色标志版权所有 (c) 2018-2021 Richard Caseres。 代码发布于 [MIT 许可证](https://github.com/skypjack/entt/blob/master/LICENSE)下。
文档发布于 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)下。
所有标志发布于 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)下。
标签:ArcGIS, Bash脚本, C++, CMake, Conan, Doxygen, ECS, Minecraft, Ragdoll, Terraform, Vcpkg, 信号槽, 头文件库, 实体组件系统, 实时渲染, 开源库, 搜索引擎爬虫, 数据擦除, 数据驱动, 无依赖, 模板库, 游戏开发, 游戏引擎, 游戏编程, 现代C++, 视图, 运行时