Dynres: hold through a savestate load, no fast descent

A load's first frames re-stage VRAM, the HD cache and pacing; treating
them as a heavy scene dropped 18x -> 11x within a second of every load
and the level climbed back slowly. Hold for the whole 2 s request and do
not arm fast descent on a load.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Shokunin
2026-10-22 13:00:07 -07:00
parent 36ee507a5c
commit ade1ecd33a
+5 -3
View File
@@ -10694,7 +10694,10 @@ static void dynres_tick(void) {
* load re-anchors pacing, the game's first seconds). */
bool soft_tail = !held && tail > 0.0 && why && std::strcmp(why, "game entry") == 0;
if (g_dynres.hold_request_s > 0.0) {
if (g_dynres.hold_request_s > tail) { tail = g_dynres.hold_request_s; soft_tail = !held; }
/* A load is not a heavy scene: its first frames re-stage VRAM, the
* HD cache and pacing. Hold the level for the whole request (hard),
* so that transient does not drop the resolution for seconds. */
if (g_dynres.hold_request_s > tail) { tail = g_dynres.hold_request_s; soft_tail = false; }
why = "savestate load";
g_dynres.hold_request_s = 0.0;
}
@@ -10735,8 +10738,7 @@ static void dynres_tick(void) {
/* A new scene: let the first sustained overrun jump several levels
* (fast descent, dynamic_resolution.h). Render-thread start and a
* new resolution re-initialize, which arms too. */
if (why && (std::strcmp(why, "savestate load") == 0 ||
std::strcmp(why, "game entry") == 0 ||
if (why && (std::strcmp(why, "game entry") == 0 ||
std::strcmp(why, "window resize") == 0))
dynrt_arm_descent(&g_dynres.rt);
dynres_tick_rt(now_s, wall, period, held, tail, why);