From dc56614b8635cc0d75503e2857b5a0a4b5960437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Wed, 26 Jun 2024 22:23:17 +0200 Subject: [PATCH] only run one update per frame drawn (#14023) # Objective - Fixes #13965 ## Solution - Don't run multiple updates for a single frame --- crates/bevy_winit/src/state.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/bevy_winit/src/state.rs b/crates/bevy_winit/src/state.rs index 0638a5cf85..dcba31bb41 100644 --- a/crates/bevy_winit/src/state.rs +++ b/crates/bevy_winit/src/state.rs @@ -58,6 +58,8 @@ struct WinitAppRunnerState { user_event_received: bool, /// Is `true` if the app has requested a redraw since the last update. redraw_requested: bool, + /// Is `true` if the app has already updated since the last redraw. + ran_update_since_last_redraw: bool, /// Is `true` if enough time has elapsed since `last_update` to run another update. wait_elapsed: bool, /// Number of "forced" updates to trigger on application start @@ -104,6 +106,7 @@ impl WinitAppRunnerState { device_event_received: false, user_event_received: false, redraw_requested: false, + ran_update_since_last_redraw: false, wait_elapsed: false, // 3 seems to be enough, 5 is a safe margin startup_forced_updates: 5, @@ -369,6 +372,9 @@ impl ApplicationHandler for WinitAppRunnerState { WindowEvent::Destroyed => { self.winit_events.send(WindowDestroyed { window }); } + WindowEvent::RedrawRequested => { + self.ran_update_since_last_redraw = false; + } _ => {} } @@ -499,7 +505,12 @@ impl ApplicationHandler for WinitAppRunnerState { if should_update { // Not redrawing, but the timeout elapsed. - self.run_app_update(); + if !self.ran_update_since_last_redraw { + self.run_app_update(); + self.ran_update_since_last_redraw = true; + } else { + self.redraw_requested = true; + } // Running the app may have changed the WinitSettings resource, so we have to re-extract it. let (config, windows) = focused_windows_state.get(self.world());