From 449afa8774e7422703bbbab4f4ef50c25865e66f Mon Sep 17 00:00:00 2001 From: Cameron <51241057+maniwani@users.noreply.github.com> Date: Tue, 10 Oct 2023 11:21:15 -0700 Subject: [PATCH 1/5] swap event buffers in `FixedUpdate` --- crates/bevy_app/src/app.rs | 4 ++-- crates/bevy_ecs/src/event.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bevy_app/src/app.rs b/crates/bevy_app/src/app.rs index a169cda57fca8..c559345c2d9f4 100644 --- a/crates/bevy_app/src/app.rs +++ b/crates/bevy_app/src/app.rs @@ -1,4 +1,4 @@ -use crate::{First, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition}; +use crate::{FixedUpdate, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition}; pub use bevy_derive::AppLabel; use bevy_ecs::{ prelude::*, @@ -467,7 +467,7 @@ impl App { { if !self.world.contains_resource::>() { self.init_resource::>().add_systems( - First, + FixedUpdate, bevy_ecs::event::event_update_system:: .run_if(bevy_ecs::event::event_update_condition::), ); diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index ef594fcf00f53..553e1ff3dea94 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -733,7 +733,7 @@ impl<'a, E: Event> ExactSizeIterator for EventIteratorWithId<'a, E> { } } -/// A system that calls [`Events::update`] once per frame. +/// A system that calls [`Events::update`]. pub fn event_update_system(mut events: ResMut>) { events.update(); } From 9e69b4fbc21586df1abac4b1d87a76ec3ceee021 Mon Sep 17 00:00:00 2001 From: Cameron <51241057+maniwani@users.noreply.github.com> Date: Tue, 10 Oct 2023 12:04:03 -0700 Subject: [PATCH 2/5] some kind of signaling --- crates/bevy_app/src/app.rs | 20 ++++++++++++++------ crates/bevy_ecs/src/event.rs | 28 +++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/crates/bevy_app/src/app.rs b/crates/bevy_app/src/app.rs index c559345c2d9f4..ad0214ba33b8c 100644 --- a/crates/bevy_app/src/app.rs +++ b/crates/bevy_app/src/app.rs @@ -1,6 +1,7 @@ -use crate::{FixedUpdate, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition}; +use crate::{First, FixedUpdate, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition}; pub use bevy_derive::AppLabel; use bevy_ecs::{ + event::EventUpdateSignal, prelude::*, schedule::{ apply_state_transition, common_conditions::run_once as run_once_condition, @@ -466,11 +467,18 @@ impl App { T: Event, { if !self.world.contains_resource::>() { - self.init_resource::>().add_systems( - FixedUpdate, - bevy_ecs::event::event_update_system:: - .run_if(bevy_ecs::event::event_update_condition::), - ); + self.init_resource::>() + .init_resource::>() + .add_systems( + First, + bevy_ecs::event::event_update_system:: + .run_if(bevy_ecs::event::event_update_condition::), + ) + .add_systems( + FixedUpdate, + bevy_ecs::event::event_queue_update_system:: + .run_if(bevy_ecs::event::event_update_condition::), + ); } self } diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index 553e1ff3dea94..10a7154d2a3c5 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -733,8 +733,34 @@ impl<'a, E: Event> ExactSizeIterator for EventIteratorWithId<'a, E> { } } +#[doc(hidden)] +#[derive(Resource)] +pub struct EventUpdateSignal(bool, PhantomData); + +impl Default for EventUpdateSignal { + fn default() -> Self { + Self(false, PhantomData) + } +} + +/// A system that queues a call to [`Events::update`]. +pub fn event_queue_update_system(signal: Option>>) { + if let Some(mut s) = signal { + s.0 = true; + } +} + /// A system that calls [`Events::update`]. -pub fn event_update_system(mut events: ResMut>) { +pub fn event_update_system( + signal: Option>>, + mut events: ResMut>, +) { + if let Some(mut s) = signal { + if !std::mem::replace(&mut s.0, false) { + return; + } + } + events.update(); } From 75796016b69b6bd047fbbcf85b7c68e51059c9d1 Mon Sep 17 00:00:00 2001 From: Cameron <51241057+maniwani@users.noreply.github.com> Date: Tue, 10 Oct 2023 12:27:48 -0700 Subject: [PATCH 3/5] new behavior only applies if `TimePlugin` is installed --- crates/bevy_app/src/app.rs | 20 +++++++------------- crates/bevy_ecs/src/event.rs | 14 ++++---------- crates/bevy_time/src/lib.rs | 6 +++++- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/crates/bevy_app/src/app.rs b/crates/bevy_app/src/app.rs index ad0214ba33b8c..0fa291563eabb 100644 --- a/crates/bevy_app/src/app.rs +++ b/crates/bevy_app/src/app.rs @@ -1,7 +1,6 @@ use crate::{First, FixedUpdate, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition}; pub use bevy_derive::AppLabel; use bevy_ecs::{ - event::EventUpdateSignal, prelude::*, schedule::{ apply_state_transition, common_conditions::run_once as run_once_condition, @@ -191,6 +190,8 @@ impl Default for App { app.init_resource::(); app.add_plugins(MainSchedulePlugin); + app.add_systems(FixedUpdate, bevy_ecs::event::event_queue_update_system); + app.add_event::(); #[cfg(feature = "bevy_ci_testing")] @@ -467,18 +468,11 @@ impl App { T: Event, { if !self.world.contains_resource::>() { - self.init_resource::>() - .init_resource::>() - .add_systems( - First, - bevy_ecs::event::event_update_system:: - .run_if(bevy_ecs::event::event_update_condition::), - ) - .add_systems( - FixedUpdate, - bevy_ecs::event::event_queue_update_system:: - .run_if(bevy_ecs::event::event_update_condition::), - ); + self.init_resource::>().add_systems( + First, + bevy_ecs::event::event_update_system:: + .run_if(bevy_ecs::event::event_update_condition::), + ); } self } diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index 10a7154d2a3c5..9eeac48367cee 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -734,17 +734,11 @@ impl<'a, E: Event> ExactSizeIterator for EventIteratorWithId<'a, E> { } #[doc(hidden)] -#[derive(Resource)] -pub struct EventUpdateSignal(bool, PhantomData); - -impl Default for EventUpdateSignal { - fn default() -> Self { - Self(false, PhantomData) - } -} +#[derive(Resource, Default)] +pub struct EventUpdateSignal(bool); /// A system that queues a call to [`Events::update`]. -pub fn event_queue_update_system(signal: Option>>) { +pub fn event_queue_update_system(signal: Option>) { if let Some(mut s) = signal { s.0 = true; } @@ -752,7 +746,7 @@ pub fn event_queue_update_system(signal: Option( - signal: Option>>, + signal: Option>, mut events: ResMut>, ) { if let Some(mut s) = signal { diff --git a/crates/bevy_time/src/lib.rs b/crates/bevy_time/src/lib.rs index 2d47acf06b60c..45a711658e18a 100644 --- a/crates/bevy_time/src/lib.rs +++ b/crates/bevy_time/src/lib.rs @@ -18,7 +18,10 @@ pub use time::*; pub use timer::*; pub use virt::*; -use bevy_ecs::system::{Res, ResMut}; +use bevy_ecs::{ + event::EventUpdateSignal, + system::{Res, ResMut}, +}; use bevy_utils::{tracing::warn, Duration, Instant}; pub use crossbeam_channel::TrySendError; use crossbeam_channel::{Receiver, Sender}; @@ -48,6 +51,7 @@ impl Plugin for TimePlugin { .init_resource::>() .init_resource::>() .init_resource::() + .init_resource::() .register_type::