diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index b0487302b3..a25c8c24eb 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -533,6 +533,7 @@ @string/frame_pacing_mode_target_Auto @string/frame_pacing_mode_target_30 + @string/frame_pacing_mode_target_45 @string/frame_pacing_mode_target_60 @string/frame_pacing_mode_target_90 @string/frame_pacing_mode_target_120 @@ -543,6 +544,7 @@ 2 3 4 + 5 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index b553402628..cba6cf8802 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -1037,6 +1037,7 @@ Auto 30 FPS + 45 FPS 60 FPS 90 FPS 120 FPS diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index d4935d9b6d..241dd42e93 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -129,7 +129,7 @@ ENUM(TimeZone, Auto, Default, Cet, Cst6Cdt, Cuba, Eet, Egypt, Eire, Est, Est5Edt ENUM(AnisotropyMode, Automatic, Default, X2, X4, X8, X16, X32, X64, None); ENUM(AstcDecodeMode, Cpu, Gpu, CpuAsynchronous); ENUM(AstcRecompression, Uncompressed, Bc1, Bc3); -ENUM(FramePacingMode, Target_Auto, Target_30, Target_60, Target_90, Target_120); +ENUM(FramePacingMode, Target_Auto, Target_30, Target_45, Target_60, Target_90, Target_120); ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed); ENUM(VramUsageMode, Conservative, Aggressive); ENUM(RendererBackend, OpenGL_GLSL, Vulkan, Null, OpenGL_GLASM, OpenGL_SPIRV); diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index f4355197b0..48cac0cca3 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -516,6 +516,7 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) { PAIR(FramePacingMode, Target_Auto, tr("Auto")), PAIR(FramePacingMode, Target_30, tr("30 FPS")), + PAIR(FramePacingMode, Target_45, tr("45 FPS")), PAIR(FramePacingMode, Target_60, tr("60 FPS")), PAIR(FramePacingMode, Target_90, tr("90 FPS")), PAIR(FramePacingMode, Target_120, tr("120 FPS")), diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 2913211480..53dd3cf1c8 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -115,20 +115,19 @@ public: /// Waits for the given GPU tick, optionally pacing frames. void Wait(u64 tick, double target_fps = 0.0) { if (Settings::values.use_speed_limit.GetValue() && target_fps > 0.0) { - const auto now = std::chrono::steady_clock::now(); + auto now = std::chrono::steady_clock::now(); if (start_time == std::chrono::steady_clock::time_point{} || current_target_fps != target_fps) { start_time = now; - frame_counter = 0; current_target_fps = target_fps; } - frame_counter++; std::chrono::duration frame_interval(1.0 / current_target_fps); - auto target_time = start_time + frame_interval * frame_counter; + auto elapsed = now - start_time; + auto expected_frame = static_cast(elapsed / frame_interval); + auto target_time = start_time + frame_interval * (expected_frame + 1); if (target_time > now) { std::this_thread::sleep_until(target_time); } else { start_time = now; - frame_counter = 0; } } if (tick > 0) { @@ -282,7 +281,6 @@ private: std::jthread worker_thread; std::chrono::steady_clock::time_point start_time{}; - u64 frame_counter{}; double current_target_fps{}; };