Skip to content

Commit 653b825

Browse files
committed
controllable app update interval
1 parent bc0c63a commit 653b825

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

crates/bevy_winit/src/lib.rs

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ pub use winit_windows::*;
1313
use bevy_app::{App, AppExit, CoreStage, Events, ManualEventReader, Plugin};
1414
use bevy_ecs::{system::IntoExclusiveSystem, world::World};
1515
use bevy_math::{ivec2, DVec2, Vec2};
16-
use bevy_utils::tracing::{error, trace, warn};
16+
use bevy_utils::{
17+
tracing::{error, trace, warn},
18+
Duration, Instant,
19+
};
1720
use bevy_window::{
1821
AppLifecycle, CreateWindow, CursorEntered, CursorLeft, CursorMoved, FileDragAndDrop, OpenFile,
1922
ReceivedCharacter, WindowBackendScaleFactorChanged, WindowCloseRequested, WindowCreated,
@@ -234,10 +237,14 @@ pub fn winit_runner_any_thread(app: App) {
234237
#[cfg(target_os = "ios")]
235238
pub struct Idiom(pub winit::platform::ios::Idiom);
236239

240+
#[derive(Clone, Copy, PartialEq, Default)]
241+
pub struct AppUpdateInterval(pub Duration);
242+
237243
pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
238244
let mut create_window_event_reader = ManualEventReader::<CreateWindow>::default();
239245
let mut app_exit_event_reader = ManualEventReader::<AppExit>::default();
240-
let mut active = true;
246+
let mut app_update = false;
247+
let mut update_interval = AppUpdateInterval::default();
241248
app.world
242249
.insert_non_send_resource(event_loop.create_proxy());
243250
#[cfg(target_os = "ios")]
@@ -254,12 +261,6 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
254261
let event_handler = move |event: Event<()>,
255262
event_loop: &EventLoopWindowTarget<()>,
256263
control_flow: &mut ControlFlow| {
257-
*control_flow = if active {
258-
ControlFlow::Poll
259-
} else {
260-
ControlFlow::Wait
261-
};
262-
263264
if let Some(app_exit_events) = app.world.get_resource_mut::<Events<AppExit>>() {
264265
if app_exit_event_reader
265266
.iter(&app_exit_events)
@@ -269,8 +270,35 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
269270
*control_flow = ControlFlow::Exit;
270271
}
271272
}
272-
273273
match event {
274+
event::Event::NewEvents(cause) => {
275+
let new_update_interval = app
276+
.world
277+
.get_resource::<AppUpdateInterval>()
278+
.copied()
279+
.unwrap_or_default();
280+
281+
if new_update_interval.0.is_zero() {
282+
app_update = true;
283+
*control_flow = ControlFlow::Poll;
284+
} else if let Some(start) = match cause {
285+
event::StartCause::Init => Some(Instant::now() + new_update_interval.0),
286+
event::StartCause::ResumeTimeReached {
287+
requested_resume, ..
288+
} => Some(requested_resume + new_update_interval.0),
289+
_ => {
290+
if new_update_interval != update_interval {
291+
Some(Instant::now() + new_update_interval.0)
292+
} else {
293+
None
294+
}
295+
}
296+
} {
297+
app_update = true;
298+
*control_flow = ControlFlow::WaitUntil(start + new_update_interval.0);
299+
}
300+
update_interval = new_update_interval;
301+
}
274302
event::Event::WindowEvent {
275303
event,
276304
window_id: winit_window_id,
@@ -455,7 +483,6 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
455483
);
456484
}
457485
WindowEvent::Focused(focused) => {
458-
active = focused;
459486
window.update_focused_status_from_backend(focused);
460487
let mut focused_events =
461488
world.get_resource_mut::<Events<WindowFocused>>().unwrap();
@@ -513,31 +540,27 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
513540
.get_resource_mut::<Events<AppLifecycle>>()
514541
.unwrap();
515542
events.send(AppLifecycle::Suspended);
516-
active = false;
517543
}
518544
event::Event::Resumed => {
519545
let mut events = app
520546
.world
521547
.get_resource_mut::<Events<AppLifecycle>>()
522548
.unwrap();
523549
events.send(AppLifecycle::Resumed);
524-
active = true;
525550
}
526551
event::Event::Background => {
527552
let mut events = app
528553
.world
529554
.get_resource_mut::<Events<AppLifecycle>>()
530555
.unwrap();
531556
events.send(AppLifecycle::Background);
532-
active = false;
533557
}
534558
event::Event::Foreground => {
535559
let mut events = app
536560
.world
537561
.get_resource_mut::<Events<AppLifecycle>>()
538562
.unwrap();
539563
events.send(AppLifecycle::Foreground);
540-
active = true;
541564
}
542565
event::Event::OpenFile(path_buf) => {
543566
let mut events = app.world.get_resource_mut::<Events<OpenFile>>().unwrap();
@@ -549,7 +572,10 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
549572
event_loop,
550573
&mut create_window_event_reader,
551574
);
552-
app.update();
575+
if app_update {
576+
app.update();
577+
app_update = false;
578+
}
553579
}
554580
_ => (),
555581
}

0 commit comments

Comments
 (0)