EnTT到目前为止一直是一个梦想,我们还没有发现一个单一的错误,它是超级容易工作的
EnTT 是一个仅有头的、微小的、易于使用的库,用于游戏编程以及用**现代C++**编写的更多内容。
在其他方面,它被用于 闽南语中使用,还有Mojang的 ArcGIS Runtime SDKs被Esri使用,还有令人惊讶的 布娃娃.
如果你在列表中没有看到你的项目,请打开一个问题,提交一个PR或在你的主题中添加#entt标签!👍
你想跟上变化,或者你有一个不需要开问题的问题?
加入gitter频道和discord服务器,认识其他像你一样的用户。我们越多,对大家越有利。
不要忘记查看常见问题和维基。你的答案可能已经在那里了。
你想支持EnTT 吗?请考虑成为一个 赞助者.非常感谢这些人,特别感谢。
目录
简介
实体-组件-系统(也被称为ECS)是一种架构模式,主要用于游戏开发。欲知详情。
这个项目一开始是一个纯粹的实体-组件系统。随着时间的推移,随着越来越多的类和功能的加入,代码库也在增长。
下面是一个简短的,但不完整的清单,它今天提供了什么。
- 内建的RTTI系统与标准系统相似。
- 一个
constexpr工具,用于人类可读的资源名称。 - 使用单态模式建立的最小的配置系统。
- 令人难以置信的快速的实体-组件系统,它有自己的付费政策。
- 视图和组来迭代实体和组件,并允许不同的访问模式,从完美的SoA到完全随机。
- 在实体-组件系统的基础上建立了很多设施,以帮助用户,避免重新发明轮子。
- 见过的最小和最基本的服务定位器的实现。
- 一个内置的、非侵入性的、无宏的运行时反射系统。
- 静态多态性变得简单,每个人都可以做到。
- 一些自制的容器,如基于稀疏集的哈希图。
- 一个适用于任何类型进程的合作调度器。
- 资源管理所需的一切(缓存、加载器、手柄)。
- 代表、信号处理程序和一个小小的事件调度器。
- 一个通用的事件发射器,作为一个基于CRTP习语的类模板。
- 还有更多!请看 维基.
把这些列表看作是正在进行的工作,也是项目的一部分。整个API对于那些敢于阅读它的人来说是有完整的代码记录的。
请注意,现在所有的工具也都是DLL友好的,并且可以跨边界顺利运行。
大多数人都知道的一件事是,EnTT 也被用于Minecraft。
考虑到这个游戏几乎到处都有,我可以自信地说,这个库已经在每个可以想到的平台上进行了充分的测试。
代码实例
#include <entt/entt.hpp>
struct position {
float x;
float y;
};
struct velocity {
float dx;
float dy;
};
void update(entt::registry ®istry) {
auto view = registry.view<const position, velocity>();
// 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<velocity>(entity);
// ...
}
}
int main() {
entt::registry registry;
for(auto i = 0u; i < 10u; ++i) {
const auto entity = registry.create();
registry.emplace<position>(entity, i * 1.f, i * 1.f);
if(i % 2 == 0) { registry.emplace<velocity>(entity, i * .1f, i * .1f); }
}
update(registry);
}
动机
我开始开发EnTT 的原因是错误的:我的目标是设计一个实体组件系统,在性能和可能的内存使用方面击败另一个知名的开源库。
最后,我做到了,但这并不令人满意。事实上,它一点都不令人满意。最快,仅此而已,确实相当少。当我意识到这一点时,我努力地保持了EnTT 的强大性能,并同时在我自己的库中增加了所有我想看到的功能。
如今,EnTT 终于成为我所寻找的东西:仍然比它的竞争对手快,在一般情况下内存使用量较低,有一个真正好的API和一套令人惊奇的功能。当然,还有更多。
性能
建议的实体-组件系统在迭代实体和组件时速度惊人,这是一个事实。一些编译器因为EnTT 的工作方式而做了大量的优化,另外一些编译器则没有那么好。总的来说,如果我们考虑现实世界的情况,EnTT 比周围的许多其他解决方案要快一点和快得多,尽管由于明显的原因我无法检查所有的解决方案。
如果你有兴趣,你可以在发布模式下编译benchmark 测试(启用编译器优化,否则意义不大),将CMake 的ENTT_BUILD_BENCHMARK 选项设置为ON ,然后自己评估你是否对结果满意。
说实话,我已经厌倦了每当有改进时就更新README文件的做法。
外面已经有很多项目使用EnTT 作为比较的基础(这应该已经告诉你很多了)。这些基准中有许多是完全错误的,还有许多只是不完整的,善于省略一些信息,并使用错误的函数来比较某个特征。当然也有好的,但如果没有人更新,它们很快就会老化,特别是当它们所面对的库正在积极开发时。
选择使用EnTT ,应该是基于它精心设计的API,它的一系列功能和总体性能,而不是因为一些单一的基准测试显示它是目前最快的工具。
在未来,我可能会尝试获得更好的性能,同时仍然增加新的功能,主要是为了好玩。
如果你想做出贡献和/或有建议,请随时做一个PR或开一个问题来讨论你的想法。
集成
EnTT 是一个只包含头文件的库。这意味着包括 头部就足以包含整个库并使用它。对于那些只对实体-组件系统感兴趣的人来说,可以考虑加入唯一的 标头来代替。这只是在文件的顶部添加以下一行的问题。entt.hpp entity/registry.hpp
#include <entt/entt.hpp>
使用下面这行,只包括实体-组件系统。
#include <entt/entity/registry.hpp>
然后向编译器传递适当的-I 参数,将src 目录添加到包含路径中。
要求
为了能够使用EnTT ,用户必须提供一个至少支持C++17的全功能编译器。
以下要求是编译测试和提取文档所必须的。
CMake3.7版或更高版本。Doxygen1.8版或更高版本。
另外,Bazel也被支持作为一个构建系统(归功于zaucy,他提出要维护它)。
在下面的文档中,我仍然会提到CMake ,这是该库的官方构建系统。
CMake
要从CMake 项目中使用EnTT ,只需将一个现有的目标链接到EnTT::EnTT 别名。
该库提供了你所需要的一切,包括定位(如find_package )、嵌入(如add_subdirectory )、获取(如FetchContent )或以你能想到的许多方式使用它,并涉及到CMake 。
涵盖所有可能的情况将需要一个条约,而不是一个简单的README文件,但我相信,任何阅读本节的人也知道它是什么,并且可以从CMake 项目中顺利使用EnTT 。
支持Natvis
当使用CMake ,只要启用选项ENTT_INCLUDE_NATVIS ,就可以享受它。
否则,大部分的工具都是通过Natvis覆盖的,所有的文件都可以在natvis 目录中找到,按模块划分。
如果你发现了错误或有建议,欢迎作出任何贡献!
包装工具
EnTT 是可用于一些最著名的包装工具的。特别是。
-
Conan, 开发人员的C/C++包装管理器。 -
vcpkg,微软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] --headvcpkg中的EnTT端口由微软团队成员和社区贡献者保持更新。
如果版本已经过时,请在vcpkg仓库中创建一个问题或拉动请求。 -
Homebrew,macOS的缺失包管理器。
可作为自制的公式。只要输入以下内容就可以安装。brew install skypjack/entt/entt -
build2,用于开发和打包C和C++代码的构建工具链。
为了在 项目中使用该entt包在build2项目中,在manifest文件中添加以下一行或类似的内容。depends: entt ^3.0.0同时检查配置是否指向一个有效的仓库,以便该软件包可以被
build2。-
cppget.org,开源社区的中央仓库,可以通过https://pkg.cppget.org/1/stable。 -
软件源存储库:可以通过
https://github.com/build2-packaging/entt.git或ssh://git@github.com/build2-packaging/entt.git访问。请随时报告这个软件包的问题。
两者都可以与
bpkg add-repo一起使用,或添加到项目中repositories.manifest。更多细节见官方文档。 -
把这个列表看作是一个正在进行中的工作,如果你愿意,可以帮助我把它做得更长。
pkg-config
EnTT 也支持 (至少对于某些定义的pkg-config 支持)。在运行 时,会生成一个名为 的合适的文件并安装在一个合适的目录中。这也应该使它更容易与诸如 或类似的工具一起使用。CMake entt.pc
Meson
文档
文档是基于doxygen的。要建立它。
$ cd build
$ cmake .. -DENTT_BUILD_DOCS=ON
$ make
API参考将在目录build/docs/html 中以HTML格式创建。要用你喜欢的浏览器来浏览它。
$ cd build
$ your_favorite_browser docs/html/index.html
同样的版本也可以在网上找到最新的版本,也就是最后的稳定标签。如果你正在寻找更赏心悦目的东西,可以考虑阅读docsforge上的漂亮版本:同样的文档,读起来更舒服。
此外,还有一个专门针对这个项目的维基,用户可以在那里找到所有相关的文档页面。
测试
为了编译和运行测试,EnTT 需要googletest。
cmake 将在编译其他东西之前下载和编译库。为了建立测试,将CMake 选项ENTT_BUILD_TESTING 设置为ON 。
要构建最基本的测试集。
$ cd build$ cmake -DENTT_BUILD_TESTING=ON ..$ make$ make test
请注意,基准不是这组测试的一部分。
行动中的EnTT
EnTT 在私人和商业应用中被广泛使用。我甚至不能提及其中的大部分,因为我在一段时间前在一些文件上签了字。幸运的是,也有一些人花时间实现了基于 的开源项目,并且在记录这些项目的时候没有保留。EnTT
在这里你可以找到一个不完整的游戏、应用程序和文章的列表,可以作为参考。
如果你知道有其他关于EnTT 的资源,请随时打开一个问题或PR,我很乐意把它们加入到列表中。
贡献者
我们非常感谢对功能的要求、PR、建议和反馈。
如果你发现你可以提供帮助,并且想用你的经验为项目做出贡献,或者你确实因为其他原因想成为项目的一部分,请随时直接联系我(你可以在简介中找到邮件)。
我不能保证每一个贡献都会被接受,但我可以保证我将尽最大努力尽快接受它们。
如果你决定参与,请在创建问题或拉动请求之前查看贡献者的指南。
也请看一下贡献者名单,以了解到目前为止有哪些人参与了。
许可证
代码和文档 Copyright (c) 2017-2022 Michele Caini.
彩色标识 Copyright (c) 2018-2021 Richard Caseres.
代码在MIT许可下发布。
文档在CC BY 4.0下发布。
所有标识在CC BY-SA 4.0下发布。


