diff options
Diffstat (limited to 'src/video/win32_v.cpp')
-rw-r--r-- | src/video/win32_v.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 8a80344c4..2fe5f67f0 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -1207,7 +1207,13 @@ void VideoDriver_Win32::MainLoop() } if (cur_ticks >= next_game_tick || (_fast_forward && !_pause_mode)) { - next_game_tick = cur_ticks + std::chrono::milliseconds(MILLISECONDS_PER_TICK); + if (_fast_forward && !_pause_mode) { + next_game_tick = cur_ticks + std::chrono::milliseconds(MILLISECONDS_PER_TICK); + } else { + next_game_tick += std::chrono::milliseconds(MILLISECONDS_PER_TICK); + /* Avoid next_game_tick getting behind more and more if it cannot keep up. */ + if (next_game_tick < cur_ticks - std::chrono::milliseconds(ALLOWED_DRIFT * MILLISECONDS_PER_TICK)) next_game_tick = cur_ticks; + } /* Flush GDI buffer to ensure we don't conflict with the drawing thread. */ GdiFlush(); @@ -1220,7 +1226,9 @@ void VideoDriver_Win32::MainLoop() } if (cur_ticks >= next_draw_tick) { - next_draw_tick = cur_ticks + std::chrono::milliseconds(MILLISECONDS_PER_TICK); + next_draw_tick += std::chrono::milliseconds(MILLISECONDS_PER_TICK); + /* Avoid next_draw_tick getting behind more and more if it cannot keep up. */ + if (next_draw_tick < cur_ticks - std::chrono::microseconds(ALLOWED_DRIFT * MILLISECONDS_PER_TICK)) next_draw_tick = cur_ticks; bool old_ctrl_pressed = _ctrl_pressed; |