From 5bce1993e1e7f1af5295e2230e98f2a4690ab994 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Sun, 8 Mar 2026 04:17:58 -0400 Subject: [PATCH] [android] Linked Frame Time Cadence to Quantized Frames --- .../src/main/jni/emu_window/emu_window.cpp | 25 +++++++++++++++++++ .../app/src/main/jni/emu_window/emu_window.h | 1 + 2 files changed, 26 insertions(+) diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index 8c2296be48..5348aa7d8c 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -116,8 +116,29 @@ float EmuWindow_Android::QuantizeFrameRateHint(float frame_rate) { return std::fabs(frame_rate - best_rate) <= tolerance ? best_rate : best_rate; } +float EmuWindow_Android::GetFrameTimeVerifiedHint() const { + if (!EmulationSession::GetInstance().IsRunning()) { + return 0.0f; + } + + const double frame_time_scale = + EmulationSession::GetInstance().System().GetPerfStats().GetLastFrameTimeScale(); + if (!std::isfinite(frame_time_scale) || frame_time_scale <= 0.0) { + return 0.0f; + } + + const float verified_rate = + std::clamp(60.0f / static_cast(frame_time_scale), 0.0f, 240.0f); + const float verified_hint = QuantizeFrameRateHint(verified_rate); + + // Frame-time verification is most useful to separate stable 30/60 FPS content. + return verified_hint <= 60.0f ? verified_hint : 0.0f; +} + float EmuWindow_Android::GetFrameRateHint() const { const float observed_rate = std::clamp(m_smoothed_present_rate, 0.0f, 240.0f); + const float frame_time_verified_hint = GetFrameTimeVerifiedHint(); + if (m_last_frame_rate_hint > 0.0f && observed_rate > 0.0f) { const float tolerance = std::max(m_last_frame_rate_hint * 0.12f, 4.0f); if (std::fabs(observed_rate - m_last_frame_rate_hint) <= tolerance) { @@ -125,6 +146,10 @@ float EmuWindow_Android::GetFrameRateHint() const { } } + if (frame_time_verified_hint > 0.0f) { + return frame_time_verified_hint; + } + const float observed_hint = QuantizeFrameRateHint(observed_rate); if (observed_hint > 0.0f) { return observed_hint; diff --git a/src/android/app/src/main/jni/emu_window/emu_window.h b/src/android/app/src/main/jni/emu_window/emu_window.h index 3d0f74a481..f74a0dd8d8 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.h +++ b/src/android/app/src/main/jni/emu_window/emu_window.h @@ -60,6 +60,7 @@ private: void UpdateFrameRateHint(); void UpdateObservedFrameRate(); [[nodiscard]] float GetFrameRateHint() const; + [[nodiscard]] float GetFrameTimeVerifiedHint() const; [[nodiscard]] static float QuantizeFrameRateHint(float frame_rate); float m_window_width{};