mirror of
https://github.com/bevyengine/bevy
synced 2024-12-22 11:03:06 +00:00
a50223622f
# Objective - https://github.com/rust-lang/rust/pull/123905 has been merged, so the workaround introduced in #12913 is no longer necessary. - Closes #12968 ## Solution - Remove unecessary `allow` attribute - This is currently blocked until Rust beta updates. - Last tested with `rustc 1.78.0-beta.7 (6fd191292 2024-04-12)`.
103 lines
4.3 KiB
Rust
103 lines
4.3 KiB
Rust
use bevy_ecs::system::Resource;
|
|
use bevy_utils::Duration;
|
|
|
|
/// Settings for the [`WinitPlugin`](super::WinitPlugin).
|
|
#[derive(Debug, Resource, Clone)]
|
|
pub struct WinitSettings {
|
|
/// Determines how frequently the application can update when it has focus.
|
|
pub focused_mode: UpdateMode,
|
|
/// Determines how frequently the application can update when it's out of focus.
|
|
pub unfocused_mode: UpdateMode,
|
|
}
|
|
|
|
impl WinitSettings {
|
|
/// Default settings for games.
|
|
///
|
|
/// [`Continuous`](UpdateMode::Continuous) if windows have focus,
|
|
/// [`ReactiveLowPower`](UpdateMode::ReactiveLowPower) otherwise.
|
|
pub fn game() -> Self {
|
|
WinitSettings {
|
|
focused_mode: UpdateMode::Continuous,
|
|
unfocused_mode: UpdateMode::ReactiveLowPower {
|
|
wait: Duration::from_secs_f64(1.0 / 60.0), // 60Hz
|
|
},
|
|
}
|
|
}
|
|
|
|
/// Default settings for desktop applications.
|
|
///
|
|
/// [`Reactive`](UpdateMode::Reactive) if windows have focus,
|
|
/// [`ReactiveLowPower`](UpdateMode::ReactiveLowPower) otherwise.
|
|
///
|
|
/// Use the [`EventLoopProxy`](crate::EventLoopProxy) to request a redraw from outside bevy.
|
|
pub fn desktop_app() -> Self {
|
|
WinitSettings {
|
|
focused_mode: UpdateMode::Reactive {
|
|
wait: Duration::from_secs(5),
|
|
},
|
|
unfocused_mode: UpdateMode::ReactiveLowPower {
|
|
wait: Duration::from_secs(60),
|
|
},
|
|
}
|
|
}
|
|
|
|
/// Returns the current [`UpdateMode`].
|
|
///
|
|
/// **Note:** The output depends on whether the window has focus or not.
|
|
pub fn update_mode(&self, focused: bool) -> &UpdateMode {
|
|
match focused {
|
|
true => &self.focused_mode,
|
|
false => &self.unfocused_mode,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Default for WinitSettings {
|
|
fn default() -> Self {
|
|
WinitSettings::game()
|
|
}
|
|
}
|
|
|
|
/// Determines how frequently an [`App`](bevy_app::App) should update.
|
|
///
|
|
/// **Note:** This setting is independent of VSync. VSync is controlled by a window's
|
|
/// [`PresentMode`](bevy_window::PresentMode) setting. If an app can update faster than the refresh
|
|
/// rate, but VSync is enabled, the update rate will be indirectly limited by the renderer.
|
|
#[derive(Debug, Clone, Copy)]
|
|
pub enum UpdateMode {
|
|
/// The [`App`](bevy_app::App) will update over and over, as fast as it possibly can, until an
|
|
/// [`AppExit`](bevy_app::AppExit) event appears.
|
|
Continuous,
|
|
/// The [`App`](bevy_app::App) will update in response to the following, until an
|
|
/// [`AppExit`](bevy_app::AppExit) event appears:
|
|
/// - `wait` time has elapsed since the previous update
|
|
/// - a redraw has been requested by [`RequestRedraw`](bevy_window::RequestRedraw)
|
|
/// - new [window](`winit::event::WindowEvent`) or [raw input](`winit::event::DeviceEvent`)
|
|
/// events have appeared
|
|
/// - a redraw has been requested with the [`EventLoopProxy`](crate::EventLoopProxy)
|
|
Reactive {
|
|
/// The approximate time from the start of one update to the next.
|
|
///
|
|
/// **Note:** This has no upper limit.
|
|
/// The [`App`](bevy_app::App) will wait indefinitely if you set this to [`Duration::MAX`].
|
|
wait: Duration,
|
|
},
|
|
/// The [`App`](bevy_app::App) will update in response to the following, until an
|
|
/// [`AppExit`](bevy_app::AppExit) event appears:
|
|
/// - `wait` time has elapsed since the previous update
|
|
/// - a redraw has been requested by [`RequestRedraw`](bevy_window::RequestRedraw)
|
|
/// - new [window events](`winit::event::WindowEvent`) have appeared
|
|
/// - a redraw has been requested with the [`EventLoopProxy`](crate::EventLoopProxy)
|
|
///
|
|
/// **Note:** Unlike [`Reactive`](`UpdateMode::Reactive`), this mode will ignore events that
|
|
/// don't come from interacting with a window, like [`MouseMotion`](winit::event::DeviceEvent::MouseMotion).
|
|
/// Use this mode if, for example, you only want your app to update when the mouse cursor is
|
|
/// moving over a window, not just moving in general. This can greatly reduce power consumption.
|
|
ReactiveLowPower {
|
|
/// The approximate time from the start of one update to the next.
|
|
///
|
|
/// **Note:** This has no upper limit.
|
|
/// The [`App`](bevy_app::App) will wait indefinitely if you set this to [`Duration::MAX`].
|
|
wait: Duration,
|
|
},
|
|
}
|