From 03b4e0dd5855971eca0f35ac22d420e9e0900bb6 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 7 Mar 2025 18:06:41 +0100 Subject: [PATCH] Use more efficient sleep approach on Windows when low-processor mode is enabled This aims to fix the idle CPU utilization regression from 4.3 to 4.4 by reverting to the previous approach, but only when low-processor mode is enabled. --- platform/windows/os_windows.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 49ff7b2d477..b0ec6852af2 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -2340,18 +2340,26 @@ void OS_Windows::add_frame_delay(bool p_can_draw) { target_ticks += dynamic_delay; uint64_t current_ticks = get_ticks_usec(); - if (target_ticks > current_ticks + delay_resolution) { - uint64_t delay_time = target_ticks - current_ticks - delay_resolution; - // Make sure we always sleep for a multiple of delay_resolution to avoid overshooting. - // Refer to: https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep#remarks - delay_time = (delay_time / delay_resolution) * delay_resolution; - if (delay_time > 0) { - delay_usec(delay_time); + if (!is_in_low_processor_usage_mode()) { + if (target_ticks > current_ticks + delay_resolution) { + uint64_t delay_time = target_ticks - current_ticks - delay_resolution; + // Make sure we always sleep for a multiple of delay_resolution to avoid overshooting. + // Refer to: https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep#remarks + delay_time = (delay_time / delay_resolution) * delay_resolution; + if (delay_time > 0) { + delay_usec(delay_time); + } + } + // Busy wait for the remainder of time. + while (get_ticks_usec() < target_ticks) { + YieldProcessor(); + } + } else { + // Use a more relaxed approach for low processor usage mode. + // This has worse frame pacing but is more power efficient. + if (current_ticks < target_ticks) { + delay_usec(target_ticks - current_ticks); } - } - // Busy wait for the remainder of time. - while (get_ticks_usec() < target_ticks) { - YieldProcessor(); } current_ticks = get_ticks_usec();