EnTT:游戏与现代C++相遇

2020-05-10 07:34:21

EnTT是一个仅包含标题的、微小的、易于使用的游戏编程类库,更多的是用现代C++编写的,主要以其创新的实体-组件-系统(ECS)模型而闻名。其中,Mojang在“我的世界”中使用了它,Esri在ArcGIS Runtime SDK中使用了它。如果您在列表中没有看到您的项目,请打开一个问题,提交PR或在您的主题中添加#entt标签!👍。

您是想跟上变化,还是有不需要您打开问题的问题?加入Gitter频道,与其他像你一样的用户见面。我们越多,对每个人都越好。

想知道为什么您的调试构建在Windows上如此缓慢,或者如何用组件表示层次结构?请查看常见问题解答和维基。如果您有这些或其他疑问,您的答案可能已经在那里了。

如果您使用EnTT并想表示感谢或支持该项目,请考虑成为赞助商。你可以帮我做出改变。非常感谢那些支持我并在今天仍然支持我的人。

实体-组件-系统(也称为ECS)是一种主要用于游戏开发的架构模式。有关更多详细信息,请访问:

该项目开始时是一个纯实体-组件系统。随着时间的推移,随着越来越多的类和功能被添加,代码库也在增长。以下是它今天提供的简短但不完整的列表:

一个基于稀疏集合的令人难以置信的快速实体组件系统,它自己为您使用策略根据用户要求调整性能和内存使用情况付费。

视图和组来迭代实体和组件,并允许不同的访问方式,从完美SoA到完全随机。

在实体组件系统之上构建了许多工具来帮助用户,避免重复发明轮子(依赖项、快照、ActorClass、对反应式系统的支持等等)。

委托、信号处理程序(具有对收集器的内置支持)和ATINY事件分派器,用于将即时和延迟事件集成到循环中。

请将此列表视为正在进行的工作和项目。整个API都有完整的代码文档,适合那些有勇气阅读它的人。

目前,EnTT在Linux、Microsoft Windows和OSX上进行了测试。事实证明,它也可以在Android和iOS上运行。它很可能在其他系统上也不会有问题,但到目前为止还没有经过充分的测试。

#include<;entt/entt.hpp>;#include<;cstdint>;struct position{Float x;Float y;};struct Velocity{Float dx;Float dy;};void update(entt::Registry&;register){自动视图=注册表。View<;Position,Velocity>;();for(自动实体:视图){//仅获取要使用的组件.。自动&;vel=查看。获取<;速度>;(实体);vel.。dx=0。dy=0;//.}}无效更新(std::uint64_t dt,entt::Registry&;register){注册表。查看<;位置、速度>;()。每个([DT](AUTO&;POS,AUTO&;Vel){//一次获取视图的所有组件.。位置。X+=vel.。DX*DT;位置。Y+=vel.。dy*dt;//.});}int main(){entt::注册表注册表;std::uint64_t dt=16;for(auto i=0;i<;10;++i){auto entity=注册表。create();注册表。emplace<;position>;(实体,i*1.f,i*1.f);if(i%2==0){注册表。放置<;速度>;(图元,i*.。1F,i*。1f);}}更新(DT,注册表);更新(注册表);//.}。

我开始开发EnTT的原因是错误的:我的目标是设计一个实体组件系统,以击败另一个著名的开源解决方案,无论是在性能方面,还是在可能的内存使用方面。最后,我做了,但不太令人满意。实际上,它一点也不令人满意。最快的,也就是最快的,真的很少。当我意识到这一点时,我努力保持EnTT的出色性能,同时添加我希望在我自己的库中看到的所有特性。

如今,EnTT终于成了我想要的:仍然比它的竞争对手更快,一般情况下内存使用量更低,非常好的API和一组令人惊叹的功能。当然,还有更多。

所提出的实体-组件系统迭代实体和组件的速度令人难以置信,这是事实。由于EnTT的工作方式,一些编译器做了很多优化,而另一些则不是很好。一般来说,如果我们考虑现实世界的情况,EnTT比周围的许多其他解决方案都要快一些,尽管我不能因为明显的原因而检查所有的解决方案。

如果您感兴趣,可以在发布模式下编译基准测试(启用编译器优化,否则意义不大),方法是将CMake的BUILD_Benchmark选项设置为ON,然后评估自己是否对结果满意。

老实说,每当有改进的时候,我都厌倦了更新自述文件。已经有很多项目使用EnTT作为比较的基础(这应该已经告诉您很多了)。这些基准中有许多是完全错误的,还有许多是不完整的,擅长省略一些信息,并使用错误的函数来比较给定的功能。当然,也有好的,但如果没有人更新它们,它们会很快老化,特别是当它们正在处理的库正在积极开发的时候。

选择使用EnTT应该基于它精心设计的API、它的特性集和一般性能,而不是因为一些单一的基准测试表明它是可用的最快的工具。

在未来,我可能会尝试获得更好的性能,同时仍然添加新的功能,主要是为了好玩。如果你想发表意见和/或有建议,请随意做公关或打开一个问题来讨论你的想法。

要使用EnTT,用户必须提供至少支持C++17的功能齐全的编译器。编译测试和提取文档必须满足以下要求:

或者,Bazel也可以作为构建系统来支持(这归功于愿意维护它的zucy)。在下面的文档中,我将仍然引用CMake,这是库的官方构建系统。

如果您正在寻找C++14版本的EnTT,请查看git标签cpp14。

EnTT是一个仅限标头的库。这意味着包括entt.hpp标题就足以包含整个库并使用它。对于那些只对实体组件系统感兴趣的人,可以考虑包含唯一的实体/registry.hpp头。问题在于将以下行添加到文件的顶部:

然后将适当的-i参数传递给编译器,以将src目录添加到include路径。

API引用将以HTML格式在目录build/docs/html中创建。要使用您最喜欢的浏览器导航,请执行以下操作:

它也可以在网上买到最新版本,也就是最后一个稳定的标签。此外,还有一个专门用于该项目的维基,用户可以在那里找到所有相关的文档页面。

要编译和运行测试,EnTT需要googletest。Cmake将在编译任何其他内容之前下载并编译库。要构建测试,请将CMake选项build_test设置为ON。

vcpkg,Microsoft VC++PackagingTool。您只需几个简单的步骤即可下载并安装EnTT:

vcpkg中的EnTT端口由Microsoft团队成员和社区贡献者保持最新。如果版本已过期,请在vcpkg存储库上创建问题或拉取请求。

MASBREW,丢失的MacOS软件包管理器。提供自制配方。只需键入以下命令即可安装:

EnTT被广泛应用于私人和商业应用中。我连大部分也不能提及,因为我很久以前在一些文件上签了名。幸运的是,也有一些人花时间实现了基于EnTT的开源项目,当涉及到记录它们时,他们并没有退缩。

在这里你可以找到一个不完整的列表,里面有游戏、应用程序和文章可供参考。

如果您知道关于EnTT的其他资源,请随时打开一个问题或公关,我很乐意将它们添加到列表中。

EnTT最初是作为其他众所周知的开源实体组件系统的更快替代方案而编写的。如今,这个图书馆正在迈出它的第一步。未来还会有更多,希望我会在很长一段时间内致力于此。功能,公关,建议,广告反馈的要求是高度赞赏。

如果您发现您可以帮助我,并且想要与您的经验一起为这个项目做贡献,或者您出于其他原因想要获得该项目的一部分,请随时直接与我联系(您可以在个人资料中找到该邮件)。我不能保证每一笔捐款都会被接受,但我可以保证我会尽我最大的努力认真对待它们。

如果您决定参与,请参阅创建问题或拉出请求之前的投稿指南。还可以看看贡献者列表,以了解到目前为止有哪些人参与了这项活动。

如果你想支持这个项目,你可以给我一杯浓缩咖啡。如果你觉得这还不够,请随时按你喜欢的方式帮助我。