From b074c0d1ee8e18ded15e8cb92945253f70de883b Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 30 Jul 2022 00:45:26 +1000 Subject: [PATCH] System: Make inter-frame sleep slightly more precise --- src/common/timer.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/common/timer.cpp b/src/common/timer.cpp index 679824f45..931d28dd8 100644 --- a/src/common/timer.cpp +++ b/src/common/timer.cpp @@ -27,9 +27,13 @@ static HANDLE GetSleepTimer() return s_sleep_timer; s_sleep_timer_created = true; - s_sleep_timer = CreateWaitableTimer(nullptr, TRUE, nullptr); + s_sleep_timer = CreateWaitableTimerEx(nullptr, nullptr, CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS); if (!s_sleep_timer) - std::fprintf(stderr, "CreateWaitableTimer() failed, falling back to Sleep()\n"); + { + s_sleep_timer = CreateWaitableTimer(nullptr, TRUE, nullptr); + if (!s_sleep_timer) + std::fprintf(stderr, "CreateWaitableTimer() failed, falling back to Sleep()\n"); + } return s_sleep_timer; } @@ -89,8 +93,19 @@ void Timer::SleepUntil(Value value, bool exact) { if (exact) { - while (GetCurrentValue() < value) - SleepUntil(value, false); + for (;;) + { + Value current = GetCurrentValue(); + if (current >= value) + break; + + // spin for the last 1ms + if ((value - current) > ConvertMillisecondsToValue(1)) + { + SleepUntil(value, false); + continue; + } + } } else {