Files
Sylpheed/docs/re/units-per-frame-is-not-a-constant.md
sylph-decoder 73f5f57966 re: WITHDRAW 120 -- units per FRAME is not a constant, the clock is time-based, 60 is right
My fourth position today, and it returns to the port's.

Splash B's logo quads in this capture step +17 per present, 14 gap-free
steps, four quads agreeing. h3-units-per-frame-measured.md measured the
SAME elements at +34 and concluded 2 units per frame.

Both are right. With the declared T=15, dA/present = 255*(units/present)/T:

  h3 capture    27.2 presents/s   +34   2.0 units/present   54.4 units/s
  this capture  51.4 presents/s   +17   1.0 units/present   51.4 units/s

Units per present halved when the presentation rate doubled. Units per
second did not move. The UI clock advances by ELAPSED TIME, not by frame
count, and "2 units per frame" was a property of a capture that ran at
27 fps, never of the game.

So my 120 units/s is withdrawn: it was 2 units/present x 60 presents/s, and
the first factor is not a constant.

The movie result is re-explained rather than refuted. 2 presents per
decoded movie frame at 51.4 presents/s is a movie decoding at 25.7 fps -- a
30 fps movie at 86% under a slow emulator. The measurement held; the
inference assumed the movie decoded at 30/s in real time, which it does not
when the emulator is slow. Same shape as the first withdrawal.

60 is now positively supported rather than merely undefended. A time-based
clock is immune to dropped frames, which predicts the dwell in seconds is
stable across runs at different frame rates -- and it is, across four runs
whose present rates differ by 1.9x: 255/4.27 = 59.7 and 210/3.46 = 60.7,
both within 1% of 60.

h3-units-per-frame-measured.md's conclusion needs demoting: its measurement
stands, its law is a single-capture artefact, and it is the origin of the
constant this question has thrashed on.

Finding 3 is open again with no surviving named cause.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
2026-09-01 19:35:24 +00:00

5.1 KiB
Raw Blame History

🔴 units per frame is NOT a constant — the UI clock is TIME-based, and 60 units/s is right

Status: measured, and it withdraws my own 120 units/s. 2026-09-01. Instrument: ⟨capture⟩ — vertex alpha per present, two captures at different presentation rates.

This is my fourth position on this number in one day and it returns to the port's. Read the mechanism, not my confidence.


The observation that settles it

Splash B's logo quads, this capture, 14 consecutive gap-free steps, four independent quads agreeing exactly:

alphas  17  34  51  68  85 102 119 136 153 170 187 204 221 238 255
steps      17  17  17  17  17  17  17  17  17  17  17  17  17  17

The corpus's committed h3-units-per-frame-measured.md measured the same elements at +34 per frame and concluded 2 units per frame, pre-registered and gap-free.

Both are right. Δα/present = 255 × (units/present) / T, and with the declared T = 15:

capture presents/s Δα/present ⇒ units/present ⇒ units/second
h3 27.2 34 2.0 54.4
this one 51.4 17 1.0 51.4

Units per present halved when the presentation rate doubled. Units per second did not move.

So the UI clock advances by ELAPSED TIME, not by frame count. "2 units per frame" was never a property of the game — it was a property of a capture that happened to run at 27 fps.

What this withdraws

🔴 My 120 units/s is wrong and is withdrawn. It was 2 units/present × 60 presents/s. The first factor is not a constant, so the product is not a rate.

🔴 And the movie result is re-explained rather than refuted. 2 presents per decoded movie frame at 51.4 presents/s is a movie decoding at 25.7 fps — a 30 fps movie running at 86 % under a slow emulator. Correct as a measurement; my inference from it assumed the movie decoded at 30/s in real time, which it does not when the emulator is slow. Same shape as the first withdrawal: the measurement held, the inference did not.

⚠️ h3-units-per-frame-measured.md's needs demoting too, and it is not mine. Its measurement stands; its conclusion — that 2 units/frame is the law — is a single-capture artefact. That page is the origin of the constant this whole question has been thrashing on.

Why 60 units/s is positively supported, not merely surviving

A time-based clock is immune to dropped frames: dropping presents makes an animation choppier, not slower. That predicts the dwell in seconds should be stable across runs at different frame rates — and it is, across four:

declared measured dwell
publisher splash 255 units 4.263 (mine) · 4.297 · 4.604 · 4.370 s
developer splash 210 units 3.457 (mine) · 3.508 · 3.503 · 3.366 s

255 / 4.27 = 59.7 units/s. 210 / 3.46 = 60.7 units/s.

Both land on 60 within ~1 %, from runs whose present rates differ by 1.9×. That agreement is only possible if the clock is time-based and the rate is 60 — which is also the natural authoring choice, one unit per 1/60 s.

The port's 60 was right the whole time. I moved off it twice on inferences built over a constant that is not constant.

Consequences

  • units/s = 60. The plate's t = 236 is 3.93 s. The port changes nothing, and this time the value is supported rather than merely undefended.
  • 🔴 Finding 3 is open again. Units-per-second is eliminated as its cause, and every other named candidate was eliminated earlier. It has no surviving named cause, and the honest state is that we do not know.
  • 📌 Anything in the corpus that converts units to seconds via "2 units per frame" is wrong at any frame rate but 30. Convert via units/60.
  • 📌 The port's splash hold question is answered on the measurement, and the numbers are below — but note it now sits against 60, not 120.

The split the port asked for, measured rather than inferred

Screen presents vs animation presents, this capture (data/splash-dwell-presents-vs-hostclock.txt):

screen animating holding
publisher 219 54 (25 %) 163 (74 %)
developer 186 58 (31 %) 127 (68 %)

⚠️ These are presents, and presents are not units — that is the whole point of this page. In units, the declared timeline already carries the hold: the publisher ramps 15→30, holds 30→235 (205 units, 80 %), and fades 239→255. The port does not need to author a hold at all; it needs to play the declared timeline at 60 units/s, which already contains one. The port's report that its screen time equals its animation time suggests it is compressing the declared hold, and that is a different bug from the constant.

Reach

⟨capture⟩ ×2 for the rate-dependence (mine and h3's, at 27.2 and 51.4 presents/s), ⟨capture⟩ ×4 for the dwell stability. The rate-dependence is the load bearing part and rests on two captures; a third at a deliberately different frame rate would nail it, and --framerate_limit makes that cheap.