jecs/howto/040_fragmentation.luau

49 lines
2.1 KiB
Text
Raw Normal View History

2025-11-30 02:47:51 +00:00
local jecs = require("@jecs")
local pair = jecs.pair
local world = jecs.world()
local Likes = world:component()
--[[
Fragmentation is a property of archetype-based ECS implementations where entities
are spread out over more archetypes as the number of different component combinations
increases. The overhead of fragmentation is visible in two areas:
- Archetype creation
- Queries (queries have to match & iterate more archetypes)
Games that make extensive use of relationships might observe high levels of
fragmentation, as relationships can introduce many different combinations of
components. While the Jecs storage is optimized for supporting large amounts
(hundreds of thousands) of archetypes, fragmentation is a factor to consider
when using relationships.
To improve the speed of evaluating queries, Jecs has indices that store all
archetypes for a given component ID. Whenever a new archetype is created, it is
registered with the indices for the IDs the archetype has, including IDs for
relationship pairs.
While registering an archetype for a relationship index is not more expensive
than registering an archetype for a regular index, an archetype with relationships
has to also register itself with the appropriate wildcard indices for its
relationships. For example, an archetype with relationship pair(Likes, Apples)
registers itself with the pair(Likes, Apples), pair(Likes, jecs.Wildcard) and
pair(jecs.Wildcard, Apples) indices. For this reason, creating new archetypes
with relationships has a higher overhead than an archetype without relationships.
]]
local alice = world:entity()
local bob = world:entity()
local charlie = world:entity()
local e1 = world:entity()
world:add(e1, pair(Likes, alice)) -- Creates archetype [pair(Likes, alice)]
local e2 = world:entity()
world:add(e2, pair(Likes, bob)) -- Creates archetype [pair(Likes, bob)]
local e3 = world:entity()
world:add(e3, pair(Likes, charlie)) -- Creates archetype [pair(Likes, charlie)]
-- Each different target creates a new archetype, leading to fragmentation
-- This is why relationships can increase archetype count significantly