entt

2025-12-10 0 564

EnTT has been a dream so far, we haven\’t found a single bug to date and it\’s
super easy to work with

— Every EnTT User Ever

EnTT is a header-only, tiny and easy to use library for game programming and
much more written in modern C++.
Among others, it\’s used
in Minecraft by Mojang, the
ArcGIS Runtime SDKs by Esri
and the amazing Ragdoll.
If you don\’t see your project in the list, please open an issue, submit a PR or
add the #entt tag to your topics! ?


Do you want to keep up with changes or do you have a question that
doesn\’t require you to open an issue?
Join the gitter channel and the
discord server, meet other users like you. The
more we are, the better for everyone.
Don\’t forget to check the
FAQs and the
wiki too. Your answers may already be
there.

Do you want to support EnTT? Consider becoming a
sponsor or making a
donation via PayPal.
Many thanks to these people and
special thanks to:

Table of Contents

  • Introduction
    • Code Example
    • Motivation
    • Benchmark
  • Integration
    • Requirements
    • CMake
    • Natvis support
    • Packaging Tools
    • pkg-config
  • Documentation
  • Tests
  • EnTT in Action
  • Contributors
  • License

Introduction

The entity-component-system (also known as ECS) is an architectural pattern
used mostly in game development. For further details:

  • Entity Systems Wiki
  • Evolve Your Hierarchy
  • ECS on Wikipedia

This project started off as a pure entity-component system. Over time the
codebase has grown as more and more classes and functionalities were added.
Here is a brief, yet incomplete list of what it offers today:

  • Built-in RTTI system mostly similar to the standard one.
  • A constexpr utility for human-readable resource names.
  • Minimal configuration system built using the monostate pattern.
  • Incredibly fast entity-component system with its own pay for what you
    use
    policy, unconstrained component types with optional pointer stability and
    hooks for storage customization.
  • Views and groups to iterate entities and components and allow different access
    patterns, from perfect SoA to fully random.
  • A lot of facilities built on top of the entity-component system to help
    the users and avoid reinventing the wheel.
  • General purpose execution graph builder for optimal scheduling.
  • The smallest and most basic implementation of a service locator ever seen.
  • A built-in, non-intrusive and macro-free runtime reflection system.
  • Static polymorphism made simple and within everyone\’s reach.
  • A few homemade containers, like a sparse set based hash map.
  • A cooperative scheduler for processes of any type.
  • All that is needed for resource management (cache, loaders, handles).
  • Delegates, signal handlers and a tiny event dispatcher.
  • A general purpose event emitter as a CRTP idiom based class template.
  • And much more! Check out the
    wiki.

Consider this list a work in progress as well as the project. The whole API is
fully documented in-code for those who are brave enough to read it.
Please, do note that all tools are also DLL-friendly now and run smoothly across
boundaries.

One thing known to most is that EnTT is also used in Minecraft.
Given that the game is available literally everywhere, I can confidently say
that the library has been sufficiently tested on every platform that can come to
mind.

Code Example

#include <entt/entt.hpp>

struct position {
    float x;
    float y;
};

struct velocity {
    float dx;
    float dy;
};

void update(entt::registry &registry) {
    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);
}

Motivation

I started developing EnTT for the wrong reason: my goal was to design an
entity-component system to beat another well known open source library both in
terms of performance and possibly memory usage.
In the end, I did it, but it wasn\’t very satisfying. Actually it wasn\’t
satisfying at all. The fastest and nothing more, fairly little indeed. When I
realized it, I tried hard to keep intact the great performance of EnTT and to
add all the features I wanted to see in my own library at the same time.

Nowadays, EnTT is finally what I was looking for: still faster than its
competitors, lower memory usage in the average case, a really good API and an
amazing set of features. And even more, of course.

Benchmark

For what it\’s worth, you\’ll never see me trying to make other projects look
bad or offer dubious comparisons just to make this library seem cooler.
I leave this activity to others, if they enjoy it (and it seems that some people
actually like it). I prefer to make better use of my time.

If you are interested, you can compile the benchmark test in release mode (to
enable compiler optimizations, otherwise it would make little sense) by setting
the ENTT_BUILD_BENCHMARK option of CMake to ON, then evaluate yourself
whether you\’re satisfied with the results or not.

There are also a lot of projects out there that use EnTT as a basis for
comparison (this should already tell you a lot). Many of these benchmarks are
completely wrong, many others are simply incomplete, good at omitting some
information and using the wrong function to compare a given feature. Certainly
there are also good ones but they age quickly if nobody updates them, especially
when the library they are dealing with is actively developed.
Out of all of them, this seems like
the most up-to-date project and also covers a certain number of libraries. I
can\’t say exactly whether EnTT is used correctly or not. However, even if used
poorly, it should still give the reader an idea of where it\’s going to operate.

Integration

EnTT is a header-only library. This means that including the entt.hpp header
is enough to include the library as a whole and use it. For those who are
interested only in the entity-component system, consider to include the sole
entity/registry.hpp header instead.
It\’s a matter of adding the following line to the top of a file:

#include <entt/entt.hpp>

Use the line below to include only the entity-component system instead:

#include <entt/entity/registry.hpp>

Then pass the proper -I argument to the compiler to add the src directory to
the include paths.

Requirements

To be able to use EnTT, users must provide a full-featured compiler that
supports at least C++17.
The requirements below are mandatory to compile the tests and to extract the
documentation:

  • CMake version 3.7 or later.
  • Doxygen version 1.8 or later.

Alternatively, Bazel is also supported as a build system
(credits to zaucy who offered to maintain it).
In the documentation below I\’ll still refer to CMake, this being the official
build system of the library.

CMake

To use EnTT from a CMake project, just link an existing target to the
EnTT::EnTT alias.
The library offers everything you need for locating (as in find_package),
embedding (as in add_subdirectory), fetching (as in FetchContent) or using
it in many of the ways that you can think of and that involve CMake.
Covering all possible cases would require a treatise and not a simple README
file, but I\’m confident that anyone reading this section also knows what it\’s
about and can use EnTT from a CMake project without problems.

Natvis support

When using CMake, just enable the option ENTT_INCLUDE_NATVIS and enjoy
it.
Otherwise, most of the tools are covered via Natvis and all files can be found
in the natvis subdirectory, divided by module.
If you spot errors or have suggestions, any contribution is welcome!

Packaging Tools

EnTT is available for some of the most known packaging tools. In particular:

  • Conan, the C/C++ Package
    Manager for Developers.

  • vcpkg, Microsoft VC++ Packaging
    Tool.
    You can download and install EnTT in just a few simple steps:

    $ git clone https://**github*.com/Microsoft/vcpkg.git
    $ cd vcpkg
    $ ./bootstrap-vcpkg.sh
    $ ./vcpkg integrate install
    $ vcpkg install entt
    

    Or you can use the experimental feature to test the latest changes:

    vcpkg install entt[experimental] --head
    

    The EnTT port in vcpkg is kept up to date by Microsoft team members and
    community contributors.
    If the version is out of date, please
    create an issue or pull request on the
    vcpkg repository.

  • Homebrew, the missing package
    manager for macOS.
    Available as a homebrew formula. Just type the following to install it:

    brew install skypjack/entt/entt
    
  • build2, build toolchain for developing and packaging C
    and C++ code.
    In order to use the entt package in a build2
    project, add the following line or a similar one to the manifest file:

    depends: entt ^3.0.0
    

    Also check that the configuration refers to a valid repository, so that the
    package can be found by build2:

    • cppget.org, the open-source community central
      repository, accessible as https://pkg.cp**pg*et.org/1/stable.

    • Package source repository:
      accessible as either https://git**hub*.com/build2-packaging/entt.git or
      ssh://git@github.com/build2-packaging/entt.git.
      Feel free to report issues with
      this package.

    Both can be used with bpkg add-repo or added in a project
    repositories.manifest. See the official
    documentation
    for more details.

  • bzlmod, Bazel\’s external
    dependency management system.
    To use the entt module in a
    bazel project, add the following to your MODULE.bazel file:

    bazel_dep(name = \"entt\", version = \"3.12.2\")

    EnTT will now be available as @entt (short for @entt//:entt) to be used
    in your cc_* rule deps.

Consider this list a work in progress and help me to make it longer if you like.

pkg-config

EnTT also supports pkg-config (for some definition of supports at least).
A suitable file called entt.pc is generated and installed in a proper
directory when running CMake.
This should also make it easier to use with tools such as Meson or similar.

Documentation

The documentation is based on doxygen. To build it:

$ cd build
$ cmake .. -DENTT_BUILD_DOCS=ON
$ make

The API reference is created in HTML format in the build/docs/html directory.
To navigate it with your favorite browser:

$ cd build
$ your_favorite_browser docs/html/index.html

The same version is also available online
for the latest release, that is the last stable tag.
Moreover, there exists a wiki dedicated
to the project where users can find all related documentation pages.

Tests

To compile and run the tests, EnTT requires googletest.
cmake downloads and compiles the library before compiling anything else. In
order to build the tests, set the CMake option ENTT_BUILD_TESTING to ON.

To build the most basic set of tests:

  • $ cd build
  • $ cmake -DENTT_BUILD_TESTING=ON ..
  • $ make
  • $ make test

Note that benchmarks are not part of this set.

EnTT in Action

EnTT is widely used in private and commercial applications. I cannot even
mention most of them because of some signatures I put on some documents time
ago. Fortunately, there are also people who took the time to implement open
source projects based on EnTT and did not hold back when it came to
documenting them.

Here you can find an
incomplete list of games, applications and articles that can be used as a
reference.

If you know of other resources out there that are about EnTT, feel free to
open an issue or a PR and I\’ll be glad to add them to the list.

Contributors

Requests for features, PRs, suggestions and feedback are highly appreciated.

If you find you can help and want to contribute to the project with your
experience or you do want to get part of the project for some other reason, feel
free to contact me directly (you can find the mail in the
profile).
I can\’t promise that each and every contribution will be accepted, but I can
assure that I\’ll do my best to take them all as soon as possible.

If you decide to participate, please see the guidelines for
contributing
before to create issues or pull requests.
Take also a look at the
contributors list to
know who has participated so far.

License

Code and documentation Copyright (c) 2017-2025 Michele Caini.
Colorful logo Copyright (c) 2018-2021 Richard Caseres.

Code released under
the MIT license.
Documentation released under
CC BY 4.0.
All logos released under
CC BY-SA 4.0.

下载源码

通过命令行克隆项目:

git clone https://github.com/skypjack/entt.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 entt https://www.zuozi.net/33585.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务