From 015bfedb4b8116d5483367adfc3d78902081bd6f Mon Sep 17 00:00:00 2001 From: Stenzek Date: Fri, 8 May 2026 22:02:59 +1000 Subject: [PATCH] FullscreenUI: Align fade transition times to frame rate --- src/core/fullscreenui_widgets.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/core/fullscreenui_widgets.cpp b/src/core/fullscreenui_widgets.cpp index b1e07c907..b14ada782 100644 --- a/src/core/fullscreenui_widgets.cpp +++ b/src/core/fullscreenui_widgets.cpp @@ -1015,7 +1015,24 @@ void FullscreenUI::BeginTransition(TransitionStartCallback func, float time) { if (s_state.transition_state == TransitionState::Inactive) { - const float real_time = UIStyle.Animations ? time : 0.0f; + float real_time = UIStyle.Animations ? time : 0.0f; + if (real_time > 0.0f) + { + // Align the transition time so that the opacity step value is evenly distributed across the time. + const float refresh_rate = + g_gpu_device->HasMainSwapChain() ? g_gpu_device->GetMainSwapChain()->GetRefreshRate() : 0.0f; + if (refresh_rate > 0.0f) + { + const float frame_time = 1.0f / refresh_rate; + const float num_frames = std::ceil(time / frame_time); + real_time = std::max(num_frames * frame_time, real_time); + } + } + else + { + real_time = 0.0f; + } + s_state.transition_state = TransitionState::Starting; s_state.transition_total_time = real_time; s_state.transition_remaining_time = real_time;