Skip to content

Mythic Masters: open-world frame budget (95th under 16.7 ms, no hitch, a party of six), hill climb to 8/10, rounds 3+ (from #3686) #3701

Closed

Description

@QuinnsCode

Score: 3/10 (target 8, on the owner's scale: agent judges halve their number, per the 2026-11-05 reset)

The owner's brief (2026-11-05): Mythic Masters' open world must be performant, especially once friends walk it together (#3663). The world is a heightfield continent with three ground patches rebuilt as you walk, instanced plants, a sky dome and weather, flocks and wild food (src/world/, docs/WORLD-EXPANSION.md).

From #3664 and #3686 (rounds 1 and 2, PR #3685): the recipe is cd apps/mythic-masters && bun scripts/walk-budget.ts (walkBudget() for a script), and test/budget.test.ts holds it with MM_BUDGET=1. The walk holds fights off (world.peace): round 1's tables measured a fight arena, see #3686's Score comment. Patch rebuilds and the grass are laid over frames. Last table: p95 16.8 ms at both sizes; frames over 50 ms 3 (desktop) and 2 (phone), against main's 15 and 19; desktop max 67 ms; phone max 700 ms, one shader compile at about 100 m; 4.31 M triangles; load 1.3 to 1.4 s, 6.4 MB.

Next: remove the last frames over 50 ms. They come every 384 m (233, 617, 1002 m), the mid patch's snap: its far-forest replant (scatterFar) or its build. Also the phone's one shader compile at about 100 m. Then tighten the test toward p95 16.7 and no frame over 50 ms. Gizmo (office/gizmo-2fa8) has the quality tier and plant culling in its own PR, then adds quality and party options to walkBudget(). The party-of-six row waits on #3663.

Goalpost: 8/10 from the owner

Scored on numbers, not taste, so each round prints the same table from the same recipe (bun run probe mythic-masters --js with the mythicMasters handle; a fixed walk of 90 seconds across a region border at a fixed hour, with a party of one and of six shown):

  1. Frame time. 95th percentile under 16.7 ms on this Mac's headless Chrome through the whole walk, and no single frame over 50 ms (the patch hitch gone: builds split over frames or moved to a worker).
  2. Draw calls and memory. Draw calls per frame and JS heap printed and flat across the walk; a party of six adds at most 12 draw calls and 60 MB.
  3. Load. Time to first walkable frame under 3 s on a cold cache locally, and the bytes it took, printed.
  4. Phones. The same walk at a phone viewport with the quality knob (@rustybuns/util/quality) on low stays under 16.7 ms at the 95th; no feature only works at high.
  5. A budget that holds. The numbers live in one test (test/budget.test.ts) that fails when a round regresses them, so the next climb can't spend them.

The loop

Each round is one PR against main that says "Part of #N" with the before/after table in the body. A fresh judge scores the five points, halves it, and the comment starts Score: x/10 (target 8) and ends Next: ...; then open "rounds N+ (from #N)", close this one with "Moved up to #new". Keep effect out of the per-frame code. At the target, a MANUAL RUN: for the owner's own walk on their phone.

Activity

  1. QuinnsCode commented on Nov 5, 2026

    @QuinnsCode
    OwnerAuthor

    Score: 3/10 (target 8). Round 3, PR #3685 (head 6ef5bed). A fresh judge scored 6/10 and that is halved.

    • Far forest over frames: the replant (scatterFar, out to 1.4 km) is laid a few ms a frame and copied into the cards at once. That was the hitch every 384 m.
    • Beast shaders warmed: a wild one's beast compiles its shaders before it swaps in for its capsule, for the composer's target on desktop and the screen on phones. That was the phone's stall at about 100 m (Gizmo traced it).
    • Test at the goal: test/budget.test.ts now holds no frame over 50 ms and none over 50 ms at worst, at both sizes.

    BEFORE (main, fair walk)

    view p95 max frames > 50 ms draw calls programs heap MB load
    desktop 16.8 83 15 99-138 51 -> 51 113 -> 116 1.50 s, 6.4 MB
    phone 16.8 100 19 67-100 40 -> 41 118 -> 95 1.16 s, 6.4 MB

    NOW

    view p95 max frames > 50 ms draw calls triangles programs heap MB load
    desktop 16.8 33.5 0 100-138 4.31 M 52 -> 52 122 -> 111 1.57 s, 6.4 MB
    phone 16.8 33.4 0 67-100 4.31 M 40 -> 41 (off the frame) 117 -> 148 1.14 s, 6.4 MB

    p95 16.8 is a 60 Hz frame (16.7) plus timer jitter.

    Judge, per point: frame time 1/2 and draw calls and memory 1/2 (both capped by the missing party-of-six row), load 2/2, phones 1/2 (no low quality tier yet), budget test 1/2 (GPU-only, so CI skips it; no party row).

    Next: the party-of-six row, which caps points 1 and 2. Gizmo plans to add party and quality options to walkBudget() once #3685 merges (the low tier is in #3682 and #3689). Then the phone heap creeping up (117 -> 148 MB). The frames themselves are held now.

  2. QuinnsCode commented on Nov 5, 2026

    @QuinnsCode
    OwnerAuthor

    Moved up to #3705

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions