From 96e7edb1f5d0f8b38146549a40049dabc26660a1 Mon Sep 17 00:00:00 2001 From: Sour Date: Wed, 13 Nov 2019 20:52:26 -0500 Subject: [PATCH] Core: Make pause/fast forward/save state/etc more responsive when running emulation at low speeds --- Core/Console.cpp | 7 ++++++- Core/FrameLimiter.h | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) 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