The map keeps drawing when the view gets busy
Two testers reported the map and the countdown clock freezing, one of them only on larger, more complex maps, and one of them until a death. Both details point at the same place. The gauges and the cockpit displays are redrawn in whatever time is left after the 3D view. The background loop is guaranteed a single pass per frame and gets more only while time remains before the frame is due, and one pass drew exactly one gauge. So a full sweep of ninety-odd gauges needed ninety-odd passes - free when there is spare frame, but on a busy map the 3D view eats all of it, the loop drops to its one guaranteed pass, and a sweep takes ninety-odd FRAMES. Seconds. A death makes the renderer skip every static object, the budget frees up, and the backlog drains at once: the display appears to come back to life. Worse, the copy phase that follows ended after a SINGLE display, so the map - one of three - came round only every third sweep. So: draw gauges to a 2ms slice rather than one per pass, which ties the refresh rate to elapsed time instead of to how much spare frame there happened to be; and copy every display before reporting the sweep done. Measured on a deliberately starved frame budget, which reproduces the reported symptom: 0.7 sweeps/s before, 3.1 after. At a normal budget 20/s, against 18-19 before - no cost to the healthy case. RP412GAUGESLICE tunes the slice and 0 restores the old behaviour, which reproduces the 0.7 exactly. RP412GAUGEDIAG=1 logs the rate; watching the screen cannot tell a display that has stopped refreshing from one whose picture simply is not changing, which is what made this hard to see. Also fixes the constructor calling Update() three lines before it initialised mDisplayToUpdate, so the first pass indexed the D3D device and surface arrays with whatever was on the stack. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -185,6 +185,22 @@ namespace
|
||||
"# default is 60; the arcade pods shipped at 25.\n"
|
||||
"TARGETFPS=60\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"
|
||||
"# time left over after the 3D view; on a big, busy map there is none\n"
|
||||
"# left, and at the original one-gauge-per-pass the map and the countdown\n"
|
||||
"# clock could sit frozen for seconds at a time - until something (a\n"
|
||||
"# death, say) lightened the 3D view enough for the backlog to drain.\n"
|
||||
"# Working to a slice ties the refresh rate to elapsed time instead. Set\n"
|
||||
"# 0 for the old behaviour; raise it to favour the displays over frame\n"
|
||||
"# rate.\n"
|
||||
"RP412GAUGESLICE=2\n"
|
||||
"\n"
|
||||
"# 1 = log how many times a second every cockpit display is actually\n"
|
||||
"# refreshed, to rpl4.log. Watching the screen cannot tell a display that\n"
|
||||
"# has stopped refreshing from one whose picture simply is not changing.\n"
|
||||
"#RP412GAUGEDIAG=1\n"
|
||||
"\n"
|
||||
"# 1 = Steam networking (lobbies, FakeIP mesh). Needs the Steam client\n"
|
||||
"# running and steam_appid.txt beside the exe; without them the game\n"
|
||||
"# logs the reason and falls back to plain TCP. 0 = TCP only.\n"
|
||||
|
||||
Reference in New Issue
Block a user