From 35b13ffab28c4eddd06976e57c110923470b69e0 Mon Sep 17 00:00:00 2001 From: Celelibi Date: Sun, 10 Feb 2019 19:35:52 +0100 Subject: Video throttling: Additive oversleeping Signed-off-by: Celelibi --- src/emu/video.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/emu/video.cpp b/src/emu/video.cpp index 12fa4d05991..a13ba49cca5 100644 --- a/src/emu/video.cpp +++ b/src/emu/video.cpp @@ -1045,7 +1045,11 @@ osd_ticks_t video_manager::throttle_until_ticks(osd_ticks_t target_ticks) while (current_ticks < target_ticks) { // compute how much time to sleep for, taking into account the average oversleep - osd_ticks_t const delta = (target_ticks - current_ticks) * 1000 / (1000 + m_average_oversleep); + osd_ticks_t delta = target_ticks - current_ticks; + if (delta > m_average_oversleep / 1000) + delta -= m_average_oversleep / 1000; + else + delta = 0; // see if we can sleep bool const slept = allowed_to_sleep && delta; @@ -1062,8 +1066,8 @@ osd_ticks_t video_manager::throttle_until_ticks(osd_ticks_t target_ticks) osd_ticks_t const actual_ticks = new_ticks - current_ticks; if (actual_ticks > delta) { - // take 90% of the previous average plus 10% of the new value - osd_ticks_t const oversleep_milliticks = 1000 * (actual_ticks - delta) / delta; + // take 99% of the previous average plus 1% of the new value + osd_ticks_t const oversleep_milliticks = 1000 * (actual_ticks - delta); m_average_oversleep = (m_average_oversleep * 99 + oversleep_milliticks) / 100; if (LOG_THROTTLE) -- cgit v1.2.3