feat(ecs): chunks as a grouping - IntIndex takes sparse values; ludic.things' chunk column and things_drop_chunk
A streamed world loads and lets go of a chunk's entities together, so a chunk is a first-class group: chunk_of(x, z, size) packs a chunk's cell into an int, tb_remove_all(tb, ix, v) removes every row an index files under one value (the observers told of each). IntIndex kept one list per value up to the largest, which a packed chunk number (hundreds of millions) turned into hundreds of millions of empty lists and a 12 GB test run; a value past 1024 now gets its slot through an IntMap, so a sparse value costs one list. ludic.things files every Thing under its 256 m chunk (TH_CHUNK), kept by every move; things_chunk_count and things_drop_chunk (the port and the facts told of each removal, as thing_remove tells them) are what the memory budget's streamed chunks ask. The moves are their own file (moves.ludic). Tests: ludic.base 35, ludic.things 8, all under a 2 GB cap (24 MB peak). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
7834b26ef8
commit
f3fec88888
11 changed files with 186 additions and 65 deletions
17
packages/ludic.things/chunks.ludic
Normal file
17
packages/ludic.things/chunks.ludic
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# chunks.ludic - the Things of one chunk of the world, counted and let go together: what a streamed
|
||||
# world asks when a chunk is loaded or dropped. A chunk is chunk_of(x, z, TH_CHUNK_M).
|
||||
export function things_chunk(x: float, z: float) -> int { return chunk_of(x, z, TH_CHUNK_M) }
|
||||
|
||||
export function things_chunk_count(things_st: ThingsState, chunk: int) -> int { return ix_count(things_st.th.chunks, chunk) }
|
||||
|
||||
# every Thing standing in the chunk removed for good, the port and the facts told of each as
|
||||
# thing_remove tells them; how many went
|
||||
export function things_drop_chunk(things_st: mut ThingsState, chunk: int) -> int {
|
||||
var n = 0
|
||||
let rows = ix_rows(things_st.th.chunks, chunk)
|
||||
while len(rows) > 0 {
|
||||
thing_remove(things_st, things_st.th.tab.rec[rows[len(rows) - 1]])
|
||||
n += 1
|
||||
}
|
||||
return n
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue