diff --git a/Core/Console.cpp b/Core/Console.cpp index df6067c..d9612db 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -157,7 +157,12 @@ void Console::ProcessEndOfFrame() } _frameLimiter->ProcessFrame(); - _frameLimiter->WaitForNextFrame(); + while(_frameLimiter->WaitForNextFrame()) { + if(_stopFlag || _frameDelay != GetFrameDelay() || _paused || _pauseOnNextFrame || _lockCounter > 0) { + //Need to process another event, stop sleeping + break; + } + } double newFrameDelay = GetFrameDelay(); if(newFrameDelay != _frameDelay) { diff --git a/Core/FrameLimiter.h b/Core/FrameLimiter.h index 80e21eb..a3d04fd 100644 --- a/Core/FrameLimiter.h +++ b/Core/FrameLimiter.h @@ -39,8 +39,15 @@ public: _targetTime += _delay; } - void WaitForNextFrame() + bool WaitForNextFrame() { + if(_targetTime - _clockTimer.GetElapsedMS() > 50) { + //When sleeping for a long time (e.g <= 25% speed), sleep in small chunks and check to see if we need to stop sleeping between each sleep call + _clockTimer.WaitUntil(_clockTimer.GetElapsedMS() + 40); + return true; + } + _clockTimer.WaitUntil(_targetTime); + return false; } }; \ No newline at end of file