entt

skypjackMIT活跃维护

现代 C++ 写的轻量级实体组件系统(ECS),用数据导向设计帮游戏和实时应用把对象逻辑解耦,跑得快又稳定。

Gaming meets modern C++ - a fast and reliable entity component system (ECS) and much more

v4.0.0发布于 2026-07-23 12:22 UTC13,255star +5 / 7 天1,124fork同步于 2026-11-10 17:27 UTC

怎么上手

由 README 提炼,执行前请确认
#include <entt/entt.hpp>
硬件要求按 README 说明

README 未说明,纯软件库,无 GPU 或显存要求

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

现代 C++ 的 header-only ECS 库,用于游戏开发中高效组织实体与组件

现代 C++ 写的轻量级实体组件系统(ECS),用数据导向设计帮游戏和实时应用把对象逻辑解耦,跑得快又稳定。

核心能力

  • 提供基于 registry 和 view 的实体组件系统
  • 支持无约束组件类型与可选指针稳定性
  • 内置类标准 RTTI 与无宏运行时反射系统
  • 附带执行图构建器用于最优调度
  • 提供稀疏集哈希表等自研容器与资源管理工具

容易踩的坑

需要支持 C++20 的编译器;编译测试和生成文档需 CMake 3.28+ 与 Doxygen 1.18+;仅用 ECS 时可只包含 entt/entity/registry.hpp 以减少依赖

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v4.0.0
  1. v4.0.0EnTT v4.0.0最新正式版2026-07-23 · 2026-07-23 12:22 UTC

    Changelog

    • config:

      • ENTT_CONSTEXPR is no longer available
      • ENTT_NOEXCEPTION renamed into ENTT_NO_EXCEPTION
      • Add ENTT_USE_STL (mainly for testing purposes)
      • Support injecting configuration via optional <entt/ext/config.h> header 👈✍️
    • core:

      • entt::identity is no longer available
      • entt::popcount is no longer available
      • entt::has_single_bit is no longer available
      • entt::next_power_of_two is no longer available
      • entt::type_identity is no longer available
      • entt::to_address is no longer available
      • Added concept enum_bitmask
      • Added concept cvref_unqualified
      • Refine type_info definition to favor concepts over sfinae
      • Invoking as_ref on an empty any returns and empty any
      • Update type_id definitions for the best
      • member_class is conditional_t friendly
    • entity

      • View-to-view conversion support for all view types
      • Added concept entt_like
      • Refine component_traits definition to favor concepts over sfinae
      • Perf improvements on storage destruction for trivially destructible types
      • Perf improvements on component destruction for trivially destructible types
      • Perf improvements when shrinking storage types
      • Reintroduce storage support to arguments for empty types
    • meta:

      • name returns an std::string_view for all meta objects
      • Added the new meta_base object
      • base() returns meta_base objects in all cases
      • Added concept meta_policy
      • Support name clashing between meta data/functions and types
      • Refine is_meta_pointer_like definition to favor concepts over sfinae
      • Copying a meta_any that wraps a non-copyable type returns an invalid meta_any
      • Added a non-const overload of meta_any::operator*
      • Pointers are no longer pointer-like types
      • meta_any supports all dereferenceable types, i.e. optionals (constness is also guaranteed)
      • Meta containers are automatically detected, meta container traits are used to opt-out
      • Multi meta type support for the same C++ type 👈😲
      • meta_types can be injected into meta_anys to rebind overloaded types as needed
      • meta_data::arity replaced with meta_data::set_arity and meta_data::get_arity
      • meta_data::arg replaced with meta_data::set_arg and meta_data::get_arg
      • meta_ctx_arg_t and meta_ctx_arg are exported via fwd.hpp too
      • meta_type::id renamed to meta_type::alias
      • meta_data::set supports additional arguments upon invocation (useful for custom setters)
      • meta_data::get supports additional arguments upon invocation (useful for custom getters)
    • signal:

      • Support enqueueing the same event type in a dispatcher from listeners
      • Update dispatcher trigger function to only accept already constructed events
    • stl:

      • A brand new submodule, mainly designed for internal purposes
      • Custom STL injection support 👈🥳
    • tools:

      • Make davey visit meta base types
      • Conditionally include <imgui> in davey.hpp
      • Improve a little the testbed for davey, but it's still a work in progress

    Build system

    • C++20 is now required to use EnTT
    • Minimum cmake version updated to 3.28
    • Minimum doxygen version updated to 1.14

    Natvis support

    All natvis files have been updated where necessary.

    Breaking changes

    • config:

      • ENTT_CONSTEXPR is no longer available, use constexpr instead
      • ENTT_NOEXCEPTION renamed into ENTT_NO_EXCEPTION
    • core:

      • entt::identity is no longer available, use std::identity instead
      • entt::popcount is no longer available, use std::popcount instead
      • entt::has_single_bit is no longer available, use std::has_single_bit instead
      • entt::next_power_of_two is no longer available, use std::bit_ceil instead
      • `entt::type
  2. v3.16.0EnTT v3.16.02025-11-20 · 2025-11-20 09:14 UTC
    查看更新说明

    Changelog

    • config:

      • core/attribute.h was merged with config.h
    • core:

      • ⚠️ Huge performance improvements of the entt::any class due to large internal changes with no impact on the API
      • Deprecate basic_any<...>::type() in favor of basic_any<...>::info()
      • Make stripped_type_name return empty views if name is not available
      • Add a full_type_name function to type info API
      • Break the dependency between basic_hashed_string and string_view
      • Make const char * conversion operator explicit for basic_hashed_string
      • Add typed data overloads to basic_any<...>
      • Add has_value overloads to basic_any<...>
      • Make basic_any support self-assignment smoothly
      • attribute.h is no longer a thing, as it was merged with config/config.h
    • container:

      • Transparent lookup for dense_map<...>::at
      • Slightly improved perf of all functions based on dense_map::constrained_find
      • Slightly improved perf of all functions based on dense_set::constrained_find
    • entity:

      • Deprecate basic_sparse_set<...>::type() in favor of basic_sparse_set<...>::info()
      • Full support to swap-only policies for runtime views
      • A const registry is no longer a sync point for the basic_organizer class
      • Make it possible to clear() the registry context as needed
      • Support swapping entity storage objects
      • Quit accepting (and silently discarding) arguments for empty types when invoking ::emplace on a storage
      • Quit accepting (and silently discarding) arguments for empty types when invoking ::insert on a storage
    • graph:

      • Make the graph method of the organizer class const as it should be
    • meta:

      • ⚠️ Huge performance improvements overall due to large internal changes with no impact on the API
      • Introduce meta_dynamic_extent for meta sequence containers
      • Deprecate basic_meta_sequence_container_traits::fixed_size in favor of basic_meta_sequence_container_traits::extent
      • Expose the element type in the factory API
      • Built-in name support for meta types, data and functions
      • Forward declared meta_factory and meta_ctx as it should be
      • Drop meta destructors support for perf reasons
      • Break safe-mode when uninitialized for meta data and meta func
      • Remove operator== and operator!= for meta_handle
      • Strip context-only and context-aware copy constructors from meta_handle
      • Make meta_any support self-assignment smoothly
      • Make as_is_t policy match the constness of the returned type, if any
      • Introduce as_value_t policy to force a copy of the returned value (default)
      • Allow top-level only searches for meta data and meta functions
      • Deprecate const meta_handle::operator->
      • Allow unsetting flags from a meta factory
    • poly:

      • Deprecate basic_poly<...>::type() in favor of basic_poly<...>::info()
    • process:

      • ⚠️ Complete redesign of the module
    • signal

      • Make delegate tests work in release mode (disable comdat folding)
    • tools:

      • Introduce davey, an ImGUI based viewer for entities and components (work in progress)

    Build system

    • Updated IWYU version
    • Prepared workflow and build system for testbed target
    • Renamed tools.yml to analyzer.yml
    • Natvis files are now part of the source tree
    • Install natvis files along with source files if requested

    Any other business

    • Removed all previously deprecated methods

    Natvis support

    All natvis files have been updated where necessary.

    Breaking changes

    • core:

      • Deprecated basic_any<...>::type(), use basic_any<...>::info() instea0d
      • const char * conversion operator is now explicit for basic_hashed_string
    • entity:

      • Deprecated basic_sparse_set<...>::type(), use basic_sparse_set<...>::info() instead
      • Arguments are no longer accepted when invoking ::emplace on a storage for empty types
      • Arguments are no lo
  3. v3.15.0EnTT v3.15.02025-03-19 · 2025-03-19 14:24 UTC
    查看更新说明

    Changelog

    • core

      • Skip most of vtable calls in any for references and dynamically allocated objects
      • Review any_policy values to better capture the nature of the elements stored with any
      • Added any::owner() because any_policy::owner is no longer available
      • Embedded-as-dynamic support for any (useful to transfer ownership of externally allocated objects)
      • is_iterator and is_equality_comparable review to refine them further
      • Self-moving an any puts it in a safe but unspecified state now
      • Introduce ENTT_CONSTEVAL config parameter
      • Apply consteval on appropriate hashed string related functions
    • entity:

      • deletion_policy::unspecified is now available and equal to swap_and_pop
      • Skip tombstone checks in more cases and improve performance of view iterators
      • Auto-disconnection support for reactive_mixin
      • Refined storage fallback mechanism for views to make it work across boundaries
      • Support joining views with storage objects directly
      • Introduce generate functions in the storage entity to replace emplace
      • Add generate functions to the sigh mixin to fully support storage entity
      • as_view and as_group are now copyable
      • Improved shrink_to_fit to also cleanup the sparse array of a sparse set
      • Extended basic_registry<...>::storage<T> const-correctness
      • Allow customizing component_traits based on the entity type
      • Default group template parameters for Get and Exclude lists
      • Make basic_organizer support groups too
      • Fix a bug on view packs when combining views with uninitialized filters
      • Make built-in storage mixins support custom private/protected registries
      • Support to reserved entities (see start_from on the entity storage)
      • Make to_entity work properly with stable types
    • meta:

      • meta_sequence_container::rebind is no longer available
      • meta_associative_container::rebind is no longer available
      • meta_any::base() to return a const reference to the underlying any
      • Deprecated meta_any_policy, meta_any::policy() and meta_any::data()
      • Self-contained meta_factory<T> to avoid having to go through meta<T>
      • Support taking ownership of passed in pointers on construction for meta_any
      • meta_type::from_void allows transferring ownership of elements too
      • Standalone meta_data and meta_func implementations
      • Make empty meta_data, meta_func and meta_type safe to use no matter what
      • Self-moving a meta_any puts it in a safe bug unspecified state now
      • Allow attaching const values of non-Type type to meta types
      • Make as_ref return valid objects when the underlying type is void
      • meta_any::context() returns the underling meta context
      • Deprecated multi-setters meta data support
      • Deprecated context-aware meta_getter utilities
      • Get the context from the instance in the remaining meta_getter utilities
      • Deprecated context-aware meta_invoke utilities
      • Get the context from the instance in the remaining meta_invoke utilities
      • Support deducing meta pointers like types directly
      • Early exit for typed allow_cast
    • signal:

      • Make it possible to create uninitialized sink objects
      • Updated definition for emitter::publish (no forwarding references)
      • Slightly review sink API (these changes should be backward compatible)

    Build system

    • Updated IWYU version
    • Updated lcov configuration to make gtest work with lcov2
    • ENTT_INSTALL to enable/disable installation steps as needed

    Any other business

    • Removed all previously deprecated methods

    Natvis support

    All natvis files have been updated where necessary.

    Breaking changes

    • core:

      • Reviewed any_policy values with breaking changes in names to avoid subtle errors on user side
    • entity:

      • Deprecated emplace in the storage entity, use generate instead
      • `com
  4. v3.14.0EnTT v3.14.02024-10-23 · 2024-10-23 12:57 UTC
    查看更新说明

    Changelog

    • config:

      • ENTT_NO_MIXIN to disable the sigh mixin by default
      • Print assertion messages upon failure
    • core:

      • Avoid uninitialized length in all (corner) cases
      • Export more types as forward declarations (see fwd.hpp)
      • Lambda support for nth_argument
      • Class level new/delete support for any
      • Class level new/delete support for uninitialized_construct_using_allocator
      • Make the monostate return *this from operator=
      • Enable enable_borrowed_range/enable_view for a few types
      • Make popcount public (waiting for C++20)
      • Rename is_power_of_two to has_single_bit (waiting for C++20)
      • Introduce bit.hpp and move a few functions there (ie has_single_bit)
      • Self assignment support for basic_any<...>
    • entity:

      • Avoid unchecked refresh loops on single type views
      • Refine empty registry check in the snapshot loader constructor
      • Stop groups from swapping observed types in their pools
      • Make sparse set sort_as function return an iterator past the last shared element
      • Update registry destroy function to use sparse set sort_as internally
      • Add operator bool to runtime views
      • Assert when emplacing invalid entities through a registry
      • Improved registry valid function
      • Decouple size and next identifier in the storage entity
      • Faster and memory-friendly storage entity create-with-hint function
      • Update the tombstone class to support zero-sized versions
      • Update entity traits the fully support zero-sized versions
      • Return the correct value from sparse set push functions
      • Drop sparse set scoped iterators (ie begin(N)/end(N))
      • Add element_type to the storage class as opposed to value_type
      • Make registry traits_type type member private
      • Make sparse set traits_type type member private
      • Make storage traits_type type member private
      • Avoid using weak ranges twice in the sigh_mixin class
      • Support comparisons between basic_handle<...> and null_t
      • Reliable valid function for empty basic_handle<...>s
      • Add pointer stable types support to the snapshot loader class
      • Branch-less sparse set sort and sort_as functions
      • Branch-less centralized swap-only mode check for views
      • Refine storage log messages to avoid ambiguity
      • Introduce the new basic_table and table classes
      • In/Out edges support for basic_organizer
      • Single type view ::operator-> to get access to the underlying storage
      • All registry now assert on custom user defined entity storage
      • Add storage_policy constexpr member to all storage classes
      • Enable enable_borrowed_range/enable_view for a few types
      • Decouple all types except basic_storage from component_traits
      • Drop the Mask parameter of the basic_observer class
      • View specialization and improvements for swap-only storage
      • View specialization and improvements for swap-and-pop storage
      • View specialization and improvements for in-place storage
      • Avoid checking for filter validity when iterating views
      • Allow resetting a storage in the registry via the reset function
      • sigh_mixin automatic signal registration support for components
      • Generic bind function in the basic_sparse_set class
      • Reactive mixin and storage (designed to replace the observer class)
      • operator bool and registry functions for sigh_mixin
      • sigh_mixin transparent support to derived registries
    • graph:

      • Add an empty method to the flow class
      • Add an empty method to the adjacency_matrix class
    • meta:

      • Add is_pointer meta traits
      • Updated meta type is_pointer function to make it faster and more reliable
      • User defined traits for meta objects
      • Self assignment support for meta_any
      • User defined arbitrary data support for meta types, meta data and meta functions
      • Guaranteed execution/iteration order on ove
  5. v3.13.2EnTT v3.13.22024-04-10 · 2024-04-10 06:57 UTC
    查看更新说明

    Changelog

    • Fix an issue on the range-insert in the sigh_mixin class
    • Add full support to empty types in the snapshot classes
    • Suppress an annoying warning by clang in the snapshot classes

    Any other business

    The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    EnTT: Gaming meets modern C++

    Build Status Coverage Try online Documentation Vcpkg port Conan Center Gitter chat Discord channel

    [!CAUTION] 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! :+1:


    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:

    mojang imgly


    [!WARNING] We apologize to our kind users for not posting updates every three days saying that we are faster than three days ago and better than everyone else, but consider it done. In the meantime, enjoy a library that just works without having to constantly remind ourselves.

    Table of Contents

    Introduction

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

    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:

    • Support for user implementations of the Standard Template Library.
    • Built-in RTTI system mostly similar to the standard one.
    • 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.
    • General purpose execution graph builder for optimal scheduling.
    • 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.
    • All that is needed for resource management (cache, loaders, handles).
    • Delegates, signal handlers and a tiny event dispatcher.
    • And much more! Check out the wiki.

    This list as well as the project are a work in progress. The whole API is fully documented 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.

    [!NOTE] A lot of stuff was invented here, but we remain humble and let people copy it without giving us credit. The good and the bad of open source, but bragging is for others. Feel free to get inspired.

    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.

    [!Note] If the EnTT API looks familiar, it's probably because it's been copied a lot elsewhere (often without much ado). Credit where credit is due though, the initial design was heavily inspired by EntityX, another popular C++ library.

    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++20. The requirements below are mandatory to compile the tests and to extract the documentation:

    • CMake version 3.28 or later.
    • Doxygen version 1.18 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.

    Note that all install calls are guarded by the ENTT_INSTALL option to allow using EnTT as a submodule without conflicting with user logic. It is therefore necessary to set the option to true to take advantage of the installation logic provided by this library.

    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:

      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.16.0")
      

      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.

    Extensions

    Community-maintained extensions for EnTT:

    • EnTTx - Adds hierarchies, prefabs, and observers for use cases such as networking and undo/redo.

    If you know of other EnTT extensions, 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-2026 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.