A fast entity component system (ECS) for C & C++
This version includes the following bugfixes:
$this
termsECS_PRIVATE
in ECS_STRUCT
This version includes the following improvements:
[c]
Change ecs_owns_id
from macro to function[queries]
Reset query match counters after iteration has finished (improves change detection usability in systems)[metrics]
Add support for metrics that count the number of entities with an id[http]
Enable blocking for HTTP send call to improve stability of sending large replies[docs]
Fix broken links in documentation (thanks @MewSoul!)[meson]
Link with ws2_32
for Windows builds (thanks @randy408!)Known issues: https://github.com/SanderMertens/flecs/issues/969 https://github.com/SanderMertens/flecs/issues/965 https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314
Full Changelog: https://github.com/SanderMertens/flecs/compare/v3.2.2...v3.2.3
This version includes the following bugfixes:
EcsTypeKindLast
ecs_iter_fini
when using chained iteratorsWith
pair would assume type of pair targetecs_rule_var_count
, ecs_rule_var_name
and ecs_rule_var_is_entity
functions (thanks @copygirl!)0
sourceecs_pipeline_stats_get
when obtaining stats for pipeline with one task systemThis version includes the following improvements:
[cpp]
Don't compile ECS_FUNC_*
marco's for C code (thanks @aganm!)[cpp]
Add component::constant
overload that works with enum classes[cpp]
Remove entity_view::delta_time
function[cpp]
Change argument of enable_rest
to HTTP port[c]
Remove unnecessary sep
variable initialization in ecs_new_from_path_w_sep
(thanks @copygirl!)[c]
Add port
member to ecs_app_desc_t
[http]
use non-blocking socket for recv
which increases stability for servers with many clients[docs]
Add note on pipeline switching performance[docs]
Update outdated cascade
example in quickstart[docs]
Fix incorrect comment for iterable::each
(thanks @ZeroErrors!)[docs]
Fix error in quickstart example[json]
Improve error handling of JSON iterator serializer[rest]
Propagate serialization errors to REST endpoints[rest]
Log errors that happen while replying to REST request to console[metrics]
Improved logic for deriving metric name from enum constant in untyped_component::metric
[internals]
Implement new entity index data structure[internals]
Replace hash function with wyhash[portability]
Emulate POSIX atomics for systems that do not have GNU builtins (thanks @aganm!)[portability]
Add compiler support for tinycc (thanks @aganm!)[ci]
Add vs2017 job to CIBenchmark results https://github.com/SanderMertens/ecs_benchmark/tree/7bb9d7cf672f0b5991b5faff4f5f8cc5afcd94ef
Breaking changes:
entity_view::delta_time
method has been removed (https://github.com/SanderMertens/flecs/discussions/466#discussioncomment-5841519)app_builder::enable_rest
has changed (https://github.com/SanderMertens/flecs/discussions/466#discussioncomment-5888615)Known issues: https://github.com/SanderMertens/flecs/issues/969 https://github.com/SanderMertens/flecs/issues/965 https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314
Full Changelog: https://github.com/SanderMertens/flecs/compare/v3.2.1...v3.2.2
FLECS_LOW_FOOTPRINT
compiler flag that reduces memory usageThis version includes the following bugfixes:
ecs_query_next_table
OnRemove
observer wasn't invoked after deferred batched clear(*, T)
pair termThis version includes the following improvements:
[cpp]
Add flecs::world::reset
method deletes/recreates a world[cpp]
Add get
/set
methods to flecs::world
for singleton pairs[cpp]
Add method to get filter from flecs::rule
(thanks @Thinkofname!)[cpp]
Add flecs::rule::rule_str
method[cpp]
Add flecs::entity_view::path_from
method[cpp]
Allow iterable::set_var
to be called for filters[cpp]
Add flecs::iter::column_index
method[cpp]
Add flecs::table::column_size
method[c]
Add ecs_field_column_index
function[c]
Add ecs_table_get_column_size
function[queries]
Improve performance of trivial query iteration (addresses performance regression in 3.2.0)[queries]
Implement change detection for flattened tables[filters]
Return data for OR terms if the type of terms in the OR chain is the same[filters]
Reuse same sizes
array for all results of filter (improves cache locality during iteration)[filters]
Improve performance of filter creation[metrics]
Implement metrics addon[docs]
Add scene management example (thanks @benjitrosch!)[docs]
Fix typos/grammar issues in relationships doc (thanks @oznogon!)[docs]
Fix outdated docs for ecs_filter_iter[docs]
Fix outdated docs for ecs_bulk_new_w_id[docs]
Fix link to FAQ in readme[cmake]
Update version number to 3.2 (thanks @podsvirov!)[internals]
Reduce overhead of tables that don't use bitsets/union relationships/flattening[internals]
Add FLECS_LOW_FOOTPRINT
compiler flag for reduced memory utilizationBreaking changes:
when_changed
argument has been added to ecs_query_populate
(https://github.com/SanderMertens/flecs/discussions/466#discussioncomment-5484364)Known issues: https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314 https://github.com/SanderMertens/flecs/issues/951
Full Changelog: https://github.com/SanderMertens/flecs/compare/v3.2.0...v3.2.1
ecs_get_target
would try inheritance for relationship with DontInherit
custom_phases_no_builtin
C++ exampleecs_get_target_id_for
ecs_iter_t::offset
in component hooksdotmember
ecs_rule_get_filter
ecs_set_entity_generation
ecs_get_target_for_id
from stageworld::vector
delta_system_time
for interval systems[c]
Add missing const
qualifiers to query functions[c]
Add missing const
qualifier to ecs_id_in_use
[c]
Add ecs_get_parent
convenience function[cpp]
Add flecs::rule::move
method[cpp]
Don't assert when creating invalid rule, add flecs::rule::is_valid
method[cpp]
Add flecs::entity_builder::set_alias
method[cpp]
Add API for singleton pairs to flecs::world
[cpp]
Ensure world is cleaned up when app().run()
returns[rules]
Rule engine refactor[rules]
Improved support for Not
, Optional
, Or
operators[rules]
Added support for fuzzy name matching[rules]
Added support for dependent terms[rules]
Added a query profiler for analyzing term performance[rules]
Many improvements to performance, VM, data structures, runtime[rules]
Add option to auto-match unresolved identifiers at query creation time by name[rules]
Add support for using any (_
) variable as term source[rules]
Add support for queries that start with Not/Optional terms[rules]
Add support for transitive queries with any (_
) target[rules]
Add support for transitive queries with self
modifier for target[rules]
Allow for usage of relationships other than IsA
for component inheritance[rules]
Add support for parsing variable values from argument string[rules]
Add performance optimization for trivial rule queries[filters]
Default to InOutNone
if the term type is not known beforehand[filters]
Change interface for Or operator to allow for neighboring Or terms[queries]
Improve query sorting performance[queries]
Add assert on invalid order_by
component id[core]
Implement relationship flattening[core]
Replace all remaining occurrences of ecs_vector_t
with ecs_vec_t
[core]
Cache (ChildOf, *)
id record on world for improved performance[core]
Cache (Identifier, Name)
id record on world for improved performance[core]
Add AlwaysOverride
component property[core]
Ensure children of a prefab are also tagged as prefabs[core]
Add stricter check on adding properties to components that are already in use[meta]
Add conversion to cursor API from bool to int[meta]
Throw less confusing error in cursor API when assigning out of bounds element/member[rest]
Add validity checks on offset
/limit
parameters[rest]
Add functions to call REST API from C[http]
Implement request caching (replaces caching mechanism of REST API)[doc]
Fix conflicting declaration in quickstart example[doc]
Fix outdated code example in systems manual[doc]
Add build instructions to quickstart for cmake and bake[doc]
Fix incorrect link in README to prefab documentation[doc]
Add parent()
, target_for()
to query section of relationship manual[doc]
Expand explorer section of REST manual with query examples[script]
Add experimental support for loading managed scripts[script]
Add experimental support for assemblies[script]
Allow for setting nested members in expression[script]
Add support for deriving variable name from assigned member[script]
Add support for adding variables as components[script]
Make EXPR
/META
addon mandatory when using script addon[script]
Add support for using foo.*
syntax[script]
Add support for module foo
syntax[script]
Add Flecs script tutorial[script]
Add support for assigning singletons with $ :- Component{}
[log]
Add ecs_log_get_level
ecs_vector_t
type has been removed from the source and replaced with ecs_vec_t
(https://github.com/SanderMertens/flecs/discussions/466#discussioncomment-5137606)https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314
Full Changelog: https://github.com/SanderMertens/flecs/compare/v3.1.5...v3.2.0
This version includes the following bugfixes:
on_set
hook was not called before observers during command batchingecs_id_is_tag
to bool
flecs::world
objectThis version includes the following improvements:
[core]
Allow for ecs_ensure
to be called from stage[core]
Add Traversable
property to allow for relationships that are acyclic but not traversable[core]
Only apply DontInherit
property to IsA
traversal[meta]
Serialization & deserialization support for opaque types[meta]
Add methods for deserializing values & entities to C++ API[json]
Add option to JSON serializer to serialize all contents of a matched table[json]
Add functions for serializing/deserializing world to/from JSON[observers]
Improve performance of invoking multiple observers for the same event[queries]
Improve detection and handling of query terms without data[cpp]
Remove redundant world argument from flecs::entity
constructor in id::second()
[cpp]
Add begin/end
methods to flecs::type
so it can be iterated[cpp]
Add entity::view
method for safe upcast from staged flecs::entity
object[cpp]
Automatically disable enum reflection for compilers that don't support it[docs]
Improve documentation of get_mut
[docs]
Rewrite of the FAQ[docs]
Add query example for singletons, add singleton section to quickstart[ux]
Add assert when not using stage when creating iterator in multi threaded world[internals]
Use observers for notifying queries of new tables[internals]
Improve performance of ecs_bulk_init
by using faster function to update entity index[internals]
Implement small utility API for parsing JSON stringsBreaking Changes:
Acyclic
property has been split up into an Acyclic
and Traversable
property (https://github.com/SanderMertens/flecs/discussions/466#discussioncomment-4871023)Known issues: https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314
Full Changelog: https://github.com/SanderMertens/flecs/compare/v3.1.4...v3.1.5
get_mut
are now immediately visible to systems & other get_mut
calls (https://github.com/SanderMertens/flecs/discussions/466#discussioncomment-4762991)Performance improved in this release for 116 in a total of 120 benchmarks! Here are a few of the most significant improvements between v3.0.0 and v3.1.4 (which also includes improvements from command batching & the observer cache):
Benchmark | v3.0.0 | v3.1.4 | Difference |
---|---|---|---|
has_id | 8.92ns | 4.38ns | +50.90% |
get_id | 7.18ns | 3.69ns | +48.61% |
get_mut_id | 12.22ns | 7.35ns | +39.85% |
set_id | 29.13ns | 11.85ns | +59.32% |
add_remove_1_tag | 20.43ns | 17.63ns | +13.71% |
add_remove_cmd_16_tags | 40.40ns | 17.55ns | +56.56% (command batching) |
get_mut_cmd_16 | 47.17ns | 18.65ns | +60.46% (command batching) |
create_delete_tree_depth_10 | 19.27us | 8.24us | +57.25% |
emit_propagate_depth_10 | 1.52us | 194.33ns | +87.25% (observer cache) |
query_iter_16_tags_4_terms | 56.39ns | 26.15ns | +53.63% |
This version includes the following bugfixes:
HAVE_EXECINFO
is defined on all platformsflecs_cpp.c
to the meson build file<strong></strong>
from documentation markdown headersflecs::ref
would store stage instead of worldecs_set_name
that overlaps with current nameset<R, T>
ecs_bulk_init
with existing tableChildOf
pair while removing nameThis version includes the following improvements:
[core]
Require entities to be alive for ECS operations[core]
Deferred ecs_get_mut_id
now returns reference to actual component if it exists (thanks @dmlary!)[c]
Add matching *_DECLARE
convenience macro's for each *_DEFINE
macro[cpp]
Add world::get_ref
[docs]
Lots of small improvements to documentation (thanks @copygirl!)[docs]
Move build instructions from README to Quickstart
[docs]
Improve build instructions for gcc/clang on Windows[ux]
Add example for entity::emplace
[internals]
Faster map implementation that no longer stores a variable size payload[internals]
Use array vs. sparse set to lookup id records with low ids[internals]
Replace usage of ecs_vector_t
in sparse set with faster ecs_vec_t
[internals]
Add new/faster sparse set operations that assume id is alive[internals]
Cleanup sparse set API[internals]
Replace code of ecs_has_id
with faster implementation[internals]
Remove redundant code from table graph operations[internals]
Improve performance of defer/suspend mechanism[internals]
Improve performance of pipelines queries by adding self
flag to System
termBreaking Changes:
get_mut
now returns pointer to existing component (https://github.com/SanderMertens/flecs/discussions/466#discussioncomment-4762991)Known issues: https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314
Full Changelog: https://github.com/SanderMertens/flecs/compare/v3.1.3...v3.1.4
This version includes the following bugfixes:
foo::bar::100
)self
term is created before idecs_remove_all
/ecs_delete_with
ChildOf
pair and deferred ecs_entity_init
EcTableHasObserved
flag (fixes reachable cache asserts)Pipeline
component (fixes segfault when using multiple pipelines)This version includes the following improvements:
[entities]
Use empty separator string to prevent tokenization of name in ecs_entity_init
[cpp]
Add const to query class methods[cpp]
Add const to iterable class methods[cpp]
Add emplace_override
for pairs[queries]
Prevent query rematching from happening more than once per query/frame[pipelines]
Prevent adding empty operation at end of schedule[table]
Support calling ecs_table_get
from stage[units]
Add units for hyperlinks, images and files[units]
Add Length::Pixel
unit[docs]
Add doxygen headers to source and include files[docs]
Add edcs_get_depth
, entity_view::depth
, ecs_table_get_depth
, table::depth
functions[docs]
Add doxygen documentation[docs]
Replace old flecs.dev site with doxygen generated one[docs]
Remove dead links to docsforge pages[docs]
Add instructions for how to fix compilation errors related to time/socket functions[ux]
Improved C/C++ APIs for working with tables[ux]
Remove redundant tracing when component is reregistered[ux]
Throw assert when trying to delete entity/component that is still queried for[internals]
Move code out of query iterator in preparation of union/bitset support for filters[internals]
Remove redundant relationship traversal call from table edge creation codeKnown issues: https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314
OnStart
phase which is ran only in the first frameThis version includes the following bugfixes:
flecs::bitmask
)use_low_id
was not set by ECS_COMPONENT
no_readonly
systemself
flag would not iterate all permutationsget_mut<First, Second>
would always return First*
This version includes the following improvements:
[cpp]
Add missing const
to flecs::world
methods[cpp]
Add missing const
to flecs::entity_view
methods[cpp]
Change argument type of run_pipeline
to flecs::entity_t
[cpp]
Add observer::query
method[pipeline]
Refactor of pipeline code[pipeline]
Add OnStart
phase for systems that are ran only at startup[rest]
Add set
endpoint for remotely setting component values[rest]
Add delete
endpoint for remotely deleting an entity[internals]
Add debugging instrumentation to allocator[internals]
Remove redundant code[internals]
Add missing tests for get
pair operations[internals]
Split off entity filter code (union relationships/bitsets) from query iterator codeKnown issues: https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314
This version includes the following bugfixes:
InOutNone
on_add
hooks when using ecs_bulk_init
no_readonly
systems in multithreaded appsIsA
relationshipfloat
to ecs_ftime_t
in system addonflecs::filter
move assignmentThis version includes the following improvements:
[c++]
Add support for run callback to C++ observers[c++]
Add typed method for getting iterator ctx in C++ API[c++]
Add support for run callback to C++ systems[c++]
Add .term<R>(string)
and .term(R, string)
overloads to filter builder[c++]
Add shorthand with
/without
methods to filter builder API[c++]
Add pair support to emplace
[c++]
Add pair support for flecs::ref
[c++]
Ensure set
, set_override
use move for pairs where possible[journal]
Implement journaling addin[queries]
Improve performance of query rematching[filters]
Allow for creation of named filters/rules[filters]
Cache id record on filter terms for faster matching[rules]
Enable overriding transitive behavior with self
flag[observers]
Refactor observer code for improved event propagation performance[observers]
Implement reachable id cache to improve event performance of adding relationships[pipeline]
Add doc name to pipeline schedule tracing[pipeline]
Exclude systems from pipeline with disabled phase/disabled module[pipeline]
Run single threaded systems on main thread[iterator]
Add ecs_iter_first
function[query DSL]
Add query DSL support for specifying flags for (r, t)
notation[commands]
Reduce lookups during command batching (performance improvement)[storage]
Reduce overhead of table graph edges, improve table creation speed[stats]
Always use double
for metric types to avoid precision issues[stats]
Add REST and HTTP statistics[units]
Add frequency units[rest]
Add endpoint for requesting results of existing query[rest]
Add endpoint for enabling/disabling entities[rest]
Add caching for named query requests[rest]
Start/stop HTTP servers when enabling/disabling REST module[http]
Send HTTP headers in send thread[http]
Improve response times and handling of HTTP preflight requests[http]
Always use double precision for time values in HTTP server[doc]
Add system examples[doc]
Update C++ examples with simplified query variable syntax[doc]
Add example to show how to forward declare component/tag variables[doc]
Fix typos in manuals[doc]
Add custom phase example that does not use builtin phases[doc]
Remove outdated reference to ecs_scope_iter
[doc]
Replace flecs::entity
with flecs::entity_t
in C++ order_by
example[doc]
Improve pipeline section of manual[doc]
Add observer examples for C/C++[ux]
Improve error message for conflicting symbols during implicit component registration[build]
Improve directory structure of cmake build to match visual studio[build]
Improve bazel build to support .inl files[internals]
Don't free chunks in flecs_sparse_clear
(performance improvement)[internals]
Use faster sparse set function in table event batching admin[internals]
Replace map with faster sparse set in generic allocator[internals]
Use faster storage for id records in low id range[internals]
Inline type_info sparse setKnown issues: https://github.com/SanderMertens/flecs/issues/844 https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314
This version includes the following bugfixes:
Not
operator in combination with relationship traversaliter
callsctx
and ctx_free
ecs_ref_t
would do more lookups than necessarymove
hook when moving entity in tableapp::run
OnRemove
observer adds component to deleted entityecs_add_path
when path is rootno_staging
system activated at end of schedule_
in ECS_STRUCT
ECS_STRUCT
This version includes the following improvements:
[c]
Added ecs_children
/ ecs_children_next
functions for iterating an entity's children[c++]
Added entity_view::parent
function (shorthand for target(flecs::ChildOf)
[c++]
Made calling world::module
in module constructor optional[c++]
Added each
/iter
overloads that accept a stage[c++]
Allow module entity to be retrieved using world::entity
/ world::component
[threading]
Allowed using the world (vs. stage) in single threaded system running in multi threaded apps[commands]
Command batching, which reduces archetype moves for entities when doing deferred operations[entity DSL]
Improved syntax[entity DSL]
Added entity DSL examples[entity DSL]
Added support for multiline strings[entity DSL]
Added support for anonymous entities[entity DSL]
Added variable support (reusable values)[entity DSL]
Added support for using simple arithmetic expressions[entity DSL]
Implemented a vscode extension for DSL syntax highlighting[os api]
Added function to get OS API struct (for easier support in language bindings)[queries]
Added ability to add user-defined context to query groups[queries]
Added assert on invalid usage of Filter
in combination with queries[queries]
Added ecs_query_next_table
for fast iteration where only tables are needed[queries]
Improved performance/cleanup technical debt of query change detection[queries]
Added ecs_query_get_group_info
function[observers]
Added EcsFilter
/flecs::Filter
term flag for terms only for filtering, not receiving events[observers]
Added level 3 trace that shows which observers are invoked[pipeline]
Improved detection of sync points, correctly handle wildcard queries[pipeline]
Always insert sync point after no_staging
system to ensure schedule consistency[stats]
Added FLECS_ACCURATE_COUNTERS
for tracking allocation counters in multithreaded apps[stats]
Added new statistics for allocators, events and performance tracking[stats]
Organized statistics into categories[stats]
Improved system time measurement so it no longer includes merge time[stats]
Fixed issue where measuring system time for last part of schedule could be skipped[stats]
Use 64bit counters to reduce occurrences of stat overflows[stats]
Ensure counter metrics are monotonically increasing in case of overflow[rest]
Added brief descriptions to stats endpoints for improved visualization in explorer[http]
Don't enqueue requests for connections that are no longer alive[http]
Don't keep HTTP connection open longer than timeout[http]
Set timeout on connection receive socket[http]
Set SO_KEEPALIVE
on connection socket so server is notified when client drops connection[http]
Implement send queue to prevent blocking on main thread when sending reply[http]
Fixed issue with sending replies without payload[ux]
Throw assert when component id overlaps with reserved bits for id flags[ux]
Added typename to invalid ctor/dtor error messages[ux]
Added assert when attempting to use ecs_bulk_init
on stage[internals]
Reduced number of heap allocations with internals now mostly using custom allocators[internals]
Allow for overriding of ECS_HI_COMPONENT_ID
macro[internals]
Allow for overriding of ECS_ID_CACHE_SIZE
macro[internals]
Reduced bits reserved for id flags from 8 to 4[internals]
Improved detection of platforms where execinfo/backtrace
is not available[internals]
Improved strbuf
API so it relies less on strlen
[internals]
Improved performance of flecs_sparse_clear
Known issues: https://github.com/SanderMertens/flecs/issues/765 https://github.com/SanderMertens/flecs/issues/714 https://github.com/SanderMertens/flecs/issues/620 https://github.com/SanderMertens/flecs/issues/478 https://github.com/SanderMertens/flecs/issues/314