Flecs is a fast and lightweight Entity Component System that lets you build games and simulations with millions of entities (join the Discord!). Here are some of the framework's highlights:
- Fast native C99 API that can be used with most game engines and scripting languages
- Modern type-safe C++11 API that doesn't rely on STL types
- Entire framework builds in less than 5 seconds.
- Cache friendly archetype/SoA storage that can process millions of entities every frame
- Automatic component registration that works out of the box across shared libraries/DLLs
- Run games on multiple CPU cores with a fast lockless scheduler and command queue
- First open source ECS with full support for entity relationships!
- Compiles warning-free on 8 compilers on all major platforms, with CI running more than 3000 tests
- No need to reinvent the wheel with fast native hierarchy, prefab and reflection implementations
- A web-based dashboard (click to try!) for exploring entities, running queries & learning Flecs:
You're looking at Flecs v3! While v3 stability is good, API changes can still happen.
Last stable v2 release: Flecs v2.4.8.
ECS is a new way of organizing code and gameplay data that lets you build game worlds that are larger, more complex and are easier to extend. ECS is different in how it dynamically binds simulation logic ('systems') with game data ('components').
Something is typically called an ECS when it:
- Has entities, that uniquely identify objects in a game
- Has components, which are datatypes that can be added to entities
- Has systems which are functions that run for all entities matching a component query
A simple example of this would be a game with two components, Position
and Velocity
, and a Move
system that finds all entities with both components, and adds Velocity
to Position
.
For more info on ECS, check the ECS FAQ!
- Quickstart (docsforge)
- FAQ (docsforge)
- C examples
- C++ examples
- Manual (docsforge)
- Query Manual (docsforge)
- Relations Manual (docsforge)
Here is some awesome content provided by the community ❤️ :
- Bgfx/Imgui module
- Tower defense example
- Bringing Flecs to UE4
- Flecs + UE4 is magic
- Quickstart with Flecs in UE4
- Automatic component registration in UE4
- Building a space battle with Flecs in UE4
- Flecs + SDL + Web ASM example (live demo)
- Flecs + Raylib example
- Flecs + gunslinger example
C99 example:
typedef struct {
float x, y;
} Position, Velocity;
void Move(ecs_iter_t *it) {
Position *p = ecs_term(it, Position, 1);
Velocity *v = ecs_term(it, Velocity, 2);
for (int i = 0; i < it->count; i ++) {
p[i].x += v[i].x;
p[i].y += v[i].y;
}
}
int main(int argc, char *argv[]) {
ecs_world_t *ecs = ecs_init();
ECS_COMPONENT(ecs, Position);
ECS_COMPONENT(ecs, Velocity);
ECS_SYSTEM(ecs, Move, EcsOnUpdate, Position, Velocity);
ecs_entity_t e = ecs_new_id(ecs);
ecs_set(ecs, e, Position, {10, 20});
ecs_set(ecs, e, Velocity, {1, 2});
while (ecs_progress(ecs, 0)) { }
}
Same example in C++11:
struct Position {
float x, y;
};
struct Velocity {
float x, y;
};
int main(int argc, char *argv[]) {
flecs::world ecs;
ecs.system<Position, const Velocity>()
.each([](Position& p, const Velocity& v) {
p.x += v.x;
p.y += v.y;
});
auto e = ecs.entity()
.set([](Position& p, Velocity& v) {
p = {10, 20};
v = {1, 2};
});
while (ecs.progress()) { }
}
Flecs has a modular architecture that makes it easy to only build the features you really need. By default all addons are built. To customize a build, first define FLECS_CUSTOM_BUILD
, then add defines for the addons you need. For example:
#define FLECS_CUSTOM_BUILD // Don't build all addons
#define FLECS_SYSTEM // Build FLECS_SYSTEM
Here's an overview of all supported addons:
Addon | Description | Define |
---|---|---|
Cpp | C++11 API | FLECS_CPP |
Module | Organize game logic into reusable modules | FLECS_MODULE |
System | Create & run systems | FLECS_SYSTEM |
Pipeline | Automatically schedule & multithread systems | FLECS_PIPELINE |
Timer | Run systems at time intervals or at a rate | FLECS_TIMER |
Meta | Flecs reflection system | FLECS_META |
Meta_C | (C) Utilities for auto-inserting reflection data | FLECS_META_C |
Expr | String format optimized for ECS data | FLECS_EXPR |
JSON | JSON format | FLECS_JSON |
Doc | Add documentation to components, systems & more | FLECS_DOC |
Coredoc | Documentation for builtin components & modules | FLECS_COREDOC |
Http | Tiny HTTP server for processing simple requests | FLECS_HTTP |
Rest | REST API for showing entities in the browser | FLECS_REST |
Parser | Create entities & queries from strings | FLECS_PARSER |
Plecs | Small utility language for asset/scene loading | FLECS_PLECS |
Rules | Powerful prolog-like query language | FLECS_RULES |
Snapshot | Take snapshots of the world & restore them | FLECS_SNAPSHOT |
Stats | See what's happening in a world with statistics | FLECS_STATS |
Log | Extended tracing and error logging | FLECS_LOG |
App | Flecs application framework | FLECS_APP |
OS API Impl | Default OS API implementation for Posix/Win32 | FLECS_OS_API_IMPL |
Flecs Hub is a handy collection of repositories built with Flecs that showcase basic ways of how to build engine features like input handling, transformations and rendering:
Module | Description |
---|---|
flecs.components.cglm | Component registration for cglm (math) types |
flecs.components.input | Components that describe keyboard and mouse input |
flecs.components.transform | Components that describe position, rotation and scale |
flecs.components.physics | Components that describe physics and movement |
flecs.components.geometry | Components that describe geometry |
flecs.components.graphics | Components used for computer graphics |
flecs.components.gui | Components used to describe GUI components |
flecs.systems.transform | Hierarchical transforms for scene graphs |
flecs.systems.physics | Systems for moving objects and collision detection |
flecs.systems.sdl2 | SDL window creation & input management |
flecs.systems.sokol | Sokol-based renderer |
The following language bindings have been developed with Flecs! Note that these are projects built and maintained by helpful community members, and may not always be up to date with the latest commit from master!
Supporting Flecs goes a long way towards keeping the project going and the community alive! If you like the project, consider:
- Giving it a star 🌟
- Becoming a sponsor: https://github.com/sponsors/SanderMertens