only run one update per frame drawn (#14023)

# Objective

- Fixes #13965 

## Solution

- Don't run multiple updates for a single frame
This commit is contained in:
François Mockers 2024-06-26 22:23:17 +02:00 committed by François
parent 4a05c737a2
commit dc56614b86
No known key found for this signature in database

View file

@ -58,6 +58,8 @@ struct WinitAppRunnerState<T: Event> {
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<T: Event> WinitAppRunnerState<T> {
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<T: Event> ApplicationHandler<T> for WinitAppRunnerState<T> {
WindowEvent::Destroyed => {
self.winit_events.send(WindowDestroyed { window });
}
WindowEvent::RedrawRequested => {
self.ran_update_since_last_redraw = false;
}
_ => {}
}
@ -499,7 +505,12 @@ impl<T: Event> ApplicationHandler<T> for WinitAppRunnerState<T> {
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());