Fifty hertz is the physics

RP412PHYSICSHZ defaults to 50: the simulation advances in fixed 20 ms
steps whatever the display does, and every machine plays the same race.
The proof preceded the promotion - a scripted lap with a crash, a burn,
a tumble and two respawns runs bit-identical at 30, 60 and 144 fps, and
identical runs reproduce exactly, neither of which was ever true of
this engine at any frame rate.

Fifty because it is exact on the engine's millisecond clock (a rate
like 60 quietly becomes 17 ms steps wearing the wrong name), and
because its settled hover ride height measured closest to the
frame-coupled physics the game has always run - the least change of
feel for the most change of correctness. The pods' 25 and the smoother
100 stay one line away for the play testers, and 0 keeps the original
frame-coupled behaviour for comparison, where the frame rate is part of
the simulation.

Carried-over environ files do not mention the option, so existing
testers get 50 on their next build and rpl4.log names both the option
they have not heard of and the mode every launch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-08-09 22:05:45 -05:00
co-authored by Claude Fable 5
parent 67d57452ba
commit 34abf40e7f
2 changed files with 20 additions and 20 deletions
+9 -6
View File
@@ -653,13 +653,16 @@ static Scalar
*setting = getenv("RP412PHYSICSHZ");
//
// OFF until it is proven. The accumulator below is correct in
// isolation but measured WORSE than the frame-coupled path it
// replaces - at 30 fps the pod climbs, at 144 it barely moves -
// so something else is still rate-dependent and feeding it. Not
// a default until the trace says two frame rates agree.
// 50 Hz is the default: a 20 ms step, exact on the millisecond
// clock, and the rate whose settled hover ride height measured
// closest to the frame-coupled physics the game has always run.
// Proven before it was defaulted - a scripted lap with a crash,
// a burn and two respawns runs bit-identical at 30, 60 and 144
// fps, and identical runs reproduce exactly. 0 restores the
// original frame-coupled behaviour, where the frame rate is
// part of the physics.
//
int rate = (setting != NULL) ? atoi(setting) : 0;
int rate = (setting != NULL) ? atoi(setting) : 50;
//
// Guard the arithmetic rather than the taste: a rate below the
+11 -14
View File
@@ -205,28 +205,25 @@ namespace
"# default is 60; the arcade pods shipped at 25.\n"
"TARGETFPS=60\n"
"\n"
"# The physics step, in steps per second - the option under test.\n"
"# The physics step, in steps per second. 50 is the default: the\n"
"# simulation advances in fixed 20 ms steps whatever the display does,\n"
"# so the SAME race plays out on every machine - measured bit-identical\n"
"# at 30, 60 and 144 fps, through a scripted lap with a crash, a burn\n"
"# and two respawns. A pod at 30 fps and a pod at 144 are finally in\n"
"# the same gravity.\n"
"#\n"
"# 0 (the default) is the game as it has always run: the simulation\n"
"# advances by however long each frame took, so the frame rate IS part\n"
"# of the physics - a pod at 30 fps falls, corners and collides\n"
"# differently from one at 144. Any other value here decouples them:\n"
"# the simulation advances in fixed steps of exactly this rate whatever\n"
"# the display does, and the SAME race plays out on every machine -\n"
"# measured bit-identical at 30, 60 and 144 fps.\n"
"#\n"
"# The three rates worth testing, all exact on the engine's millisecond\n"
"# clock:\n"
"# The alternatives, all exact on the engine's millisecond clock:\n"
"# 25 the arcade pods' rate - the step the original handling was\n"
"# tuned against, coarsest contact response\n"
"# 50 the middle road\n"
"# 100 the smoothest contact and terrain response\n"
"# 0 the original frame-coupled physics, where the frame rate is\n"
"# part of the simulation - kept for comparison\n"
"# (Rates that do not divide 1000 evenly - 60, say - quietly run at the\n"
"# nearest millisecond step instead; the log says so if you try one.)\n"
"#\n"
"# What to feel for against 0: hover bounce, wall hits, how the pod\n"
"# What to feel for between rates: hover bounce, wall hits, how the pod\n"
"# takes the crest of a hill. Report the rate with the verdict.\n"
"#RP412PHYSICSHZ=50\n"
"RP412PHYSICSHZ=50\n"
"\n"
"# How long one background pass may spend drawing cockpit gauges, in\n"
"# milliseconds. The gauges and the MFD/map displays are redrawn in the\n"