diff --git a/src/video/video_driver.cpp b/src/video/video_driver.cpp --- a/src/video/video_driver.cpp +++ b/src/video/video_driver.cpp @@ -116,21 +116,6 @@ void VideoDriver::Tick() /* Avoid next_draw_tick getting behind more and more if it cannot keep up. */ if (this->next_draw_tick < now - ALLOWED_DRIFT * this->GetDrawInterval()) this->next_draw_tick = now; - /* Keep the interactive randomizer a bit more random by requesting - * new values when-ever we can. */ - InteractiveRandom(); - - this->InputLoop(); - - /* Check if the fast-forward button is still pressed. */ - if (fast_forward_key_pressed && !_networking && _game_mode != GM_MENU) { - ChangeGameSpeed(true); - this->fast_forward_via_key = true; - } else if (this->fast_forward_via_key) { - ChangeGameSpeed(false); - this->fast_forward_via_key = false; - } - /* Locking video buffer can block (especially with vsync enabled), do it before taking game state lock. */ this->LockVideoBuffer(); @@ -139,9 +124,24 @@ void VideoDriver::Tick() std::lock_guard lock_wait(this->game_thread_wait_mutex); std::lock_guard lock_state(this->game_state_mutex); + /* Keep the interactive randomizer a bit more random by requesting + * new values when-ever we can. */ + InteractiveRandom(); + this->DrainCommandQueue(); while (this->PollEvent()) {} + this->InputLoop(); + + /* Check if the fast-forward button is still pressed. */ + if (fast_forward_key_pressed && !_networking && _game_mode != GM_MENU) { + ChangeGameSpeed(true); + this->fast_forward_via_key = true; + } else if (this->fast_forward_via_key) { + ChangeGameSpeed(false); + this->fast_forward_via_key = false; + } + ::InputLoop(); /* Prevent drawing when switching mode, as windows can be removed when they should still appear. */