diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 7ef3de2dd79..b0c4e1490bf 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();