a program's states made on first injection, and the ECS stores started at 8 slots
Maroon Lake's launcher watcher - a process that only spawns the game and waits - held 58 MB, 48 MB of it MALLOC_SMALL. Measured with malloc stack logging it was not the state defaults but L_grow: every program sized every property type's per-entity store to MAX_ENT (1024) slots at start, 1,583 stores, entities or none. And every state record was made with its defaults in L_init_globals before Boot. - emit_lazy.ludic: a program's (not the runtime's) state global is left out of L_init_globals, and every read of it calls @S_<global>(), which makes it on first call from its own initializer - after every registry and plain global, so a default may read them (the init-order crash cannot come back through a state). What a getter makes is declared (@lp_fdecl): a state first touched in play is made once and not judged as a frame's keep. A function value's trampoline calls the getter too. - L_grow starts the stores at ECS_FIRST (8) and doubles as entities come, as it always did past MAX_ENT. The watcher (with the game's watch step moved before the systems' defs): 57 MB -> 11 MB; the only state it makes is UiState (14 KB). What is left: AppKit's window, opened by rt_init before main for any windowed program (~4 MB), and the runtime's font, image and 2D inits (~1.2 MB). Goldens: the arena, fence, value and json goldens; the 36 ui examples; 30 of the 32 ECS test cases (sprite_render and sprite_atlas time out under a plain runner with the toolchain before this too). Package tests: ludic.base, save, settings, i18n. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
90b23e11e9
commit
12fdc0717e
8 changed files with 57983 additions and 57067 deletions
|
|
@ -4,6 +4,9 @@
|
|||
# parts of compiler/back/ir_decl.c.
|
||||
|
||||
const MAX_ENT: int = 1024
|
||||
# the stores' first size, doubled as entities come: one slot per property type is made for every
|
||||
# program at start, so 1024 of them made ~1,500 stores 48 MB in a process that spawns nothing
|
||||
const ECS_FIRST: int = 8
|
||||
|
||||
function has_systems() -> bool {
|
||||
var i = 0
|
||||
|
|
@ -171,7 +174,7 @@ function ecs_base(store: pointer) -> pointer {
|
|||
function emit_ecs_grow() -> void {
|
||||
emit("define void @L_grow(i32 %need) {\nentry:\n %cap = load i32, ptr @L_cap\n")
|
||||
emit(" %ok = icmp sle i32 %need, %cap\n br i1 %ok, label %done, label %grow\ngrow:\n")
|
||||
emit(` %c0 = icmp eq i32 %cap, 0\n %start = select i1 %c0, i32 {itoa(MAX_ENT)}, i32 %cap\n br label %dbl\n`)
|
||||
emit(` %c0 = icmp eq i32 %cap, 0\n %start = select i1 %c0, i32 {itoa(ECS_FIRST)}, i32 %cap\n br label %dbl\n`)
|
||||
emit("dbl:\n %nc = phi i32 [ %start, %grow ], [ %nc2, %dbl2 ]\n %enough = icmp sge i32 %nc, %need\n")
|
||||
emit(" br i1 %enough, label %apply, label %dbl2\ndbl2:\n %nc2 = mul i32 %nc, 2\n br label %dbl\n")
|
||||
emit("apply:\n %cap64 = sext i32 %cap to i64\n %nc64 = sext i32 %nc to i64\n")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue