CH 05

— Bulletin

◀ Return to log

Bulletin 01 · 2026-01-18

The frame budget is a lie

Sixteen milliseconds is an average, not a contract. What three years of orbital telemetry taught me about the frames nobody measures.

Author
Alex Mercer
Published
2026-01-18
Reading time
2 min
Filed under
Performance
FIG.01 — Frame time distribution, ground station 04Live capture

// Bulletin

Every performance budget I have ever been handed was a single number. Sixty frames a second, sixteen point six milliseconds a frame, and a promise that if the average holds the interface will feel smooth. It does not work that way. NEON_FLUX held a 14ms mean for eight months and still felt broken to the operators watching it.

The problem is that an average hides its own tail. Four hundred frames at 9ms and four frames at 180ms average out beautifully, and read — to a human being — as a stutter. Operators do not experience the mean. They experience the worst frame in the last second, and they remember it far longer than the four hundred good ones.

The tail had three suppliers, and none of them showed up in the profiler’s steady state. The first was garbage collection triggered by the ingest path allocating a fresh buffer per message — forty thousand small objects a second is a metronome for the collector. The second was layout: one status widget read offsetHeight after a write, and every fourth frame paid for a full reflow of a panel nobody was looking at. The third was the network itself handing us bursts — frames arrive in clumps, and a renderer that processes everything it has before drawing will happily spend 80ms being thorough.

Each fix was boring on its own. Buffers became a preallocated ring, reused forever, which silenced the collector. The layout read moved ahead of the writes. The renderer learned to drain at most one frame’s worth of ingest per draw and let the rest wait — the data is timestamped, so nothing is lost, only deferred by milliseconds.

So we stopped reporting averages. The dashboard now shows the 99th percentile frame time and a count of frames over 33ms, and nothing else. Both numbers looked worse than what they replaced, which is the honest outcome: we had not regressed, we had simply started measuring the thing that was already wrong.

The budget that survived is not a number, it is a shape: a P99 under 20ms, zero frames over 33ms in any five-minute window, measured at the ground station, not on my machine. When the shape holds, nobody asks about the mean. Nobody ever asked about the mean — they asked why the screen hitched, and now it does not.

// In this bulletin

  • — Why the mean hides stutter
  • — Measuring at the 99th percentile
  • — Zero-copy WebSocket ingest
  • — What shipped, and what did not

“Operators do not experience the mean. They experience the worst frame in the last second.”

— On instrumenting NEON_FLUX
FIG.02 — P99 frame time before and after zero-copy ingest8 week window
Alex MercerSolid State · Colour Television
LIGHT
  • FB
  • X
  • LI
  • GH