mirror of
https://github.com/vladtrc/iw4L
synced 2026-10-26 02:11:39 -04:00
311c8fa336
`make bench` is one recipe over one run now. `IW4L_BENCH=1` arms an in-process recorder on the spans that already feed Perfetto, and at exit the run prints two independent reports and writes them to `iw4l-artifacts/bench/<stamp>.txt`: the waterfall from the shell command to a playable map, carrying the time each load stage held the pool alone, and frame time as a span tree whose nesting is recorded rather than declared. Neither needs a trace file or Trace Processor, and either can be MISS while the other stands. `bench-demo` and `bench-load` are gone — a goal after `bench` is a demo, `ZONE=` is a live map. A bot is no longer minted onto an id a real client already owns. The roster steps over the ids the authority and the local player hold, and a slot that still lands on the local player is retired, because `is_bot` would otherwise claim the player and nothing could drive the slot anyway. A stretch with no authority ack re-adopts the next snapshot and counts one stall; three of them still fail the link. Failing on the first turned every long frame into a permanent disconnect. The loading overlay comes down once the world is installed rather than waiting on the class-select hop, which a replay never makes — it was playing the whole demo behind `UiLayer::Loading`, with map ambience held back. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013bHwyKwUjaYmtVG1F3Ttku
2.4 KiB
2.4 KiB
docs/ — the one-page map
Short files (each ≤50 lines) on what lives where and how to poke the live game. Keep them this short: nobody opens a long file twice.
| file | about | when to read |
|---|---|---|
RUN.md |
running (make map, --cmds), controls frozen until Playing, force_match_start, sync-by-default, the verb list and the traps |
before your first live run |
WINDOWS.md |
portable iw4launcher.exe: .env, shortcuts into CoD, writable iw4l-artifacts/ |
building and running on Windows |
DEPLOY.md |
make release / publish / deploy: the play profile, hashed .zst, master by SHA, provision kept separate |
shipping a release, "why is the player on an old version" |
MASTER.md |
your own master over ssh from the machine with the clone: cargo xtask master install, a self-signed certificate with no domain, what to hand players |
standing up a relay for yourself or your friends |
PERF.md |
native .pftrace — the only runtime truth; picking a UUID, the manifest, IW4L_PERF, SQL |
traces, scenario SQL, why a frame took 80 ms |
BENCH.md |
make bench: the map-load waterfall and stage exclusive time, then frame time as a span tree; in-process, no trace needed |
"where did this run spend its time" |
RENDER.md |
the nine crates of the island, the frame path IR → cull → one drawsurf list → tess → material → SM3 → wgpu, GPU-side ownership, the d3d9_* border |
touching the picture, techsets, lighting |
ANIM.md |
three floors: anim_iw4 (facts and curves), xmodel_runtime (tree and pose), who picks the clip (sim / render_frontend/adapters/anim/) |
viewmodel, skeleton, bone hits |
MAP-LOAD.md |
map load: the session → assets → install transaction, the load_prepared_match walk, the lane by ZoneGame, the artifact cache |
a zone won't load, an asset went missing, "why didn't the match come up" |
ENTITIES.md |
the TickInput → sim::step → Snapshot funnel, the entity_iw4 taxonomy (EntityState / Centity / ET_* / trajectories), what sits where in sim |
gameplay, networking, replay |
SIM-STEP.md |
sim::step: one TickInput → Snapshot funnel for authority, prediction and replay; StepReason; what makes a step deterministic |
touching the step, prediction or replay |