Skip to content

Ukendio/jecs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Apr 26, 2025
d0af805 · Apr 26, 2025
Apr 13, 2025
Apr 25, 2025
Mar 30, 2025
Apr 25, 2025
Mar 30, 2025
Mar 27, 2025
Apr 22, 2025
Feb 5, 2025
Apr 25, 2025
Aug 20, 2024
Apr 25, 2025
Mar 27, 2025
Mar 27, 2025
Apr 12, 2025
Oct 12, 2024
Mar 27, 2025
Apr 25, 2025
Jun 11, 2024
Nov 23, 2024
Nov 23, 2024
Nov 23, 2024
Apr 4, 2025
Apr 26, 2025
Mar 27, 2025
Apr 4, 2025
Apr 4, 2025
Mar 27, 2025
Oct 21, 2024
Mar 1, 2025

Repository files navigation

License: MIT Wally

Just a stupidly fast Entity Component System

  • Entity Relationships as first class citizens
  • Iterate 800,000 entities at 60 frames per second
  • Type-safe Luau API
  • Zero-dependency package
  • Optimized for column-major operations
  • Cache friendly archetype/SoA storage
  • Rigorously unit tested for stability

Example

local world = jecs.World.new()
local pair = jecs.pair

-- These components and functions are actually already builtin
-- but have been illustrated for demonstration purposes
local ChildOf = world:component()
local Name = world:component()

local function parent(entity)
    return world:target(entity, ChildOf)
end
local function getName(entity)
    return world:get(entity, Name)
end

local alice = world:entity()
world:set(alice, Name, "alice")

local bob = world:entity()
world:add(bob, pair(ChildOf, alice))
world:set(bob, Name, "bob")

local sara = world:entity()
world:add(sara, pair(ChildOf, alice))
world:set(sara, Name, "sara")

print(getName(parent(sara)))

for e in world:query(pair(ChildOf, alice)) do
    print(getName(e), "is the child of alice")
end

-- Output
-- "alice"
-- bob is the child of alice
-- sara is the child of alice

21,000 entities 125 archetypes 4 random components queried. Queries Can be found under /benches/visual/query.luau

Inserting 8 components to an entity and updating them over 50 times. Insertions Can be found under /benches/visual/insertions.luau