Fix crash when using Duration::MAX (#4900)

# Objective

If you set the `ReactiveLowPower` max wait to `Duration::MAX`, stuff panics. Fix that.

## Solution

Wait forever if addition failed.
This commit is contained in:
Alex Saveau 2022-06-02 19:42:20 +00:00
parent f487407e07
commit 9976ecb810
2 changed files with 17 additions and 3 deletions

View file

@ -591,7 +591,11 @@ pub fn winit_runner_with(mut app: App) {
*control_flow = match winit_config.update_mode(focused) {
Continuous => ControlFlow::Poll,
Reactive { max_wait } | ReactiveLowPower { max_wait } => {
ControlFlow::WaitUntil(now + *max_wait)
if let Some(instant) = now.checked_add(*max_wait) {
ControlFlow::WaitUntil(instant)
} else {
ControlFlow::Wait
}
}
};
}

View file

@ -68,7 +68,12 @@ pub enum UpdateMode {
/// Once the app has executed all bevy systems and reaches the end of the event loop, there is
/// no way to force the app to wake and update again, unless a `winit` event (such as user
/// input, or the window being resized) is received or the time limit is reached.
Reactive { max_wait: Duration },
Reactive {
/// The maximum time to wait before the event loop runs again.
///
/// Note that Bevy will wait indefinitely if the duration is too high (such as [`Duration::MAX`]).
max_wait: Duration,
},
/// The event loop will only update if there is a winit event from direct interaction with the
/// window (e.g. mouseover), a redraw is requested, or the maximum wait time has elapsed.
///
@ -85,5 +90,10 @@ pub enum UpdateMode {
/// window is not focused, to only re-draw your bevy app when the cursor is over the window, but
/// not when the mouse moves somewhere else on the screen. This helps to significantly reduce
/// power consumption by only updated the app when absolutely necessary.
ReactiveLowPower { max_wait: Duration },
ReactiveLowPower {
/// The maximum time to wait before the event loop runs again.
///
/// Note that Bevy will wait indefinitely if the duration is too high (such as [`Duration::MAX`]).
max_wait: Duration,
},
}