A modern, lightweight Entity-Component-System framework in C++.

✨ Overview
P-E-R-R-Y ECS is a header-only, type-safe library for game development, simulations, or any system that benefits from separating data from logic.
It implements the Entity-Component-System (ECS) pattern with modern C++ features:
- Templates & variadic functions for type safety
- Optional concepts (C++20) for system constraints
- Efficient storage and fast iteration
Core goals:
- 🧩 Component-oriented storage with type-safety
- ⚡ Fast lookups via
SparseArray and type-based storage
- 🔄 Flexible Systems: can operate on any combination of components
- ✅ Unit-tested with GoogleTest
- 🚀 Header-only, easy integration
🧱 Features
- Create entities and attach any combination of components
- Add systems that operate on specific components
- Variadic interface: add multiple components or systems at once
- Owned (rvalue) vs Non-owned (lvalue) systems
- Safe runtime updates via
Registry::callSystem<System>()
- Component access via
getComponents<T>()
🧩 Example Usage
#include <memory>
public:
for(size_t i = 0; i < positions.size(); ++i) {
if (positions[i] && velocities[i])
positions[i].value() += velocities[i].value();
}
}
};
int main() {
}
Definition TestEcs.cpp:81
MoveSystem()
Definition TestEcs.cpp:83
void update(Registry &r) override
Pure virtual function executed by all concrete systems.
Definition TestEcs.cpp:85
Entity class from ECS.
Definition Entity.hpp:26
define the Registry class
Definition Registry.hpp:44
void addComponent(Entity const &to, Component &&...c)
Definition Registry_impl.hpp:50
Entity createEntity()
handling entities (define in Registry.cpp)
Definition Registry.cpp:14
void callSystem()
call a system
Definition Registry_impl.hpp:93
SparseArray< Component > & getComponents()
get components of a given type
Definition Registry_impl.hpp:40
void addSystem(System &s)
handling systems
Definition Registry_impl.hpp:68
void registerComponentsByExtraction()
register every components by extraction from a tuple
Definition Registry_impl.hpp:33
Health Value.
Definition TestEcs.cpp:50
int value
Definition TestEcs.cpp:51
2Dposition
Definition TestEcs.cpp:35
int y
Definition TestEcs.cpp:36
void operator+=(const Velocity &vel)
Definition TestEcs.cpp:39
int x
Definition TestEcs.cpp:36
2Dvelocity
Definition TestEcs.cpp:23
int x
Definition TestEcs.cpp:24
int y
Definition TestEcs.cpp:24