From ade1ecd33a561603918ae690e1d1882e77951cd8 Mon Sep 17 00:00:00 2001 From: Shokunin <30949000+tetrisgm@users.noreply.github.com> Date: Thu, 22 Oct 2026 13:00:07 -0700 Subject: [PATCH] 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 --- runtime/src/main.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/runtime/src/main.cpp b/runtime/src/main.cpp index ce0a1350..ade4ed3a 100644 --- a/runtime/src/main.cpp +++ b/runtime/src/main.cpp @@ -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);