Awesome
What is this?
This is a rough comparison table of all the "popular" ECS frameworks written and used in C#.
Table
Support...
:heavy_check_mark: = Full
:heavy_check_mark:Ex = Full with extension
:heavy_minus_sign: = Partial
:x: = None
Feature | Leo<br/>ECS | Leo<br/>EcsLite | Default<br/>Ecs | Svelto<br/>.ECS | Morpeh | Unity<br/>ECS | Entitas | chrome<br/>alex<br/>/ecs | Nano<br/>ECS | Ego<br/>CS | actors<br/>.unity | Feature |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Archetype based | :x: | :x: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark:? | :x:? | :x: | :x: | Archetype based |
Filter/Query operations | Has/Not<br/>(Inc/Exc) | Has/Not<br/>(Inc/Exc) | Has/Not<br/>Or/Nor | Has/Not<br/>(With/<br/>Without) | Has/Not/Or<br/>(All/Any/None) | Has/Not, Any<br/>(All/None) | Has/Not, Any | Has/Not<br/>(With/<br/>Without) | Has | Has | Filter/Query operations | |
Components Type support | struct | struct | struct<br/>/class<br/>/interface | struct<br/>/interface | struct | struct<br/>/class | class | struct | class | class | class? | Components Type support |
Code Generation based | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | Code Generation based | |
Dependencies | None | None | None | None | :heavy_minus_sign:Unity<br/>Odin Inspector | Unity | :heavy_minus_sign:Unity | Unity | Unity | Unity | Unity | Dependencies |
Engine agnostic | :heavy_check_mark: | :heavy_check_mark: | :x:? | :heavy_check_mark: | :heavy_minus_sign: | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: | Engine agnostic |
Custom Engine Support | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_minus_sign: | :x: | :x: | :x: | :x: | Custom Engine Support | |
Threading support | :heavy_check_mark:Ex | :heavy_check_mark:Ex | :heavy_check_mark: | :x: | :heavy_minus_sign: | :heavy_minus_sign:? | :x: | :x:? | :heavy_minus_sign:? | Threading support | ||
World Events/Messages | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x:? | :x: | :x:? | :heavy_check_mark: | :heavy_check_mark: | World Events/Messages | ||
One-Frame Components | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark:EX | :x:? | :heavy_check_mark: | One-Frame Components | ||||||
Dependency Injection<br/>Support | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | Dependency Injection<br/>Support | ||
Shared Resource | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | Shared Resource | ||||
Thread-safe | :x: | :x: | :heavy_minus_sign: | :heavy_minus_sign: | :x: | :x: | :x: | :x:? | :x: | :x: | :x:? | Thread-safe |
Reactive System | :x: | :x: | :heavy_check_mark: | :heavy_minus_sign: | :x: | :x:? | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | Reactive System | ||
Multiple components of same type on entity | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | Multiple components of same type on entity | |||
Components can live without entities | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: | :heavy_check_mark: | Components can live without entities | ||||
Entities can live without components | :x: | :x: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | Entities can live without components | |||||
Unity Editor View support | :heavy_check_mark:Ex | :heavy_check_mark:Ex | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | Unity Editor View support |
Unity Editor Full Integration* | :x: | :x: | :x: | :x: | :heavy_minus_sign:? | :x:(WIP) | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark:? | Unity Editor Full Integration* | ||
Unity Burst Compatible | :x: | :heavy_check_mark:Ex | :x: | :heavy_check_mark: | :heavy_minus_sign: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x:? | :x:? | :x: | Unity Burst Compatible |
Unity Jobs Compatible | :x: | :heavy_check_mark:Ex | :x: | :heavy_check_mark: | :heavy_minus_sign: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x:? | :x:? | :heavy_minus_sign:? | Unity Jobs Compatible |
License | MIT | MIT | MIT-0 | MIT | MIT | Unity<br/>Companion<br/>License | MIT | MIT | MIT | MIT | MIT | License |
Last Major Version Release Date | Feb<br/>2022 | Feb<br/>2022 | Feb<br/>2022 | May<br/>2023 | May<br/>2023 | Sep<br/>2022 | Sep<br/>2022 | Sep<br/>2020? | Dec<br/>2019 | Mar<br/>2017 | Jul<br/>2020 | Last Major Version Release Date |
Feature | Leo<br/>ECS | Leo<br/>EcsLite | Default<br/>Ecs | Svelto<br/>.ECS | Morpeh | Unity<br/>ECS | Entitas | chrome<br/>alex<br/>/ecs | Nano<br/>ECS | Ego<br/>CS | actors<br/>.unity | Feature |
*(Unity Editor) Full Integration means that systems & components can be made, disabled, enabled, and configured in Unity Editor.
How can I contribute?
Find a table cell (or multiple) that isn't filled out, and make an issue/pull request about it. While stating why it's true (explanation doesn't have to be very sophisticated or sourced/grounded, most of the time).
OR
Find a table cell (or multiple) that has a quesiton mark, and source why it's true/untrue with an issue or pull request.
FAQ
Q: Why not split the table?
A: I think the table isn't big enough for a split to be valuable, and it's easier to check for all the features you'd want with one glance, instead of going back and forth between two tables.
Q: xECS isn't here, why's that?
A: Idk, ask about it in a new issue, it might be too niche, or something.