pub struct Events<T> { /* private fields */ }
Expand description
An event collection that represents the events that occurred within the last two
Events::update
calls.
Events can be written to using an EventWriter
and are typically cheaply read using an EventReader
.
Each event can be consumed by multiple systems, in parallel,
with consumption tracked by the EventReader
on a per-system basis.
If no ordering
is applied between writing and reading systems, there is a risk of a race condition.
This means that whether the events arrive before or after the next Events::update
is unpredictable.
This collection is meant to be paired with a system that calls
Events::update
exactly once per update/frame.
Events::update_system
is a system that does this, typically intialized automatically using
add_event
.
EventReader
s are expected to read events from this collection at least once per loop/frame.
Events will persist across a single frame boundary and so ordering of event producers and
consumers is not critical (although poorly-planned ordering may cause accumulating lag).
If events are not handled by the end of the frame after they are updated, they will be
dropped silently.
Example
use bevy_ecs::event::Events;
struct MyEvent {
value: usize
}
// setup
let mut events = Events::<MyEvent>::default();
let mut reader = events.get_reader();
// run this once per update/frame
events.update();
// somewhere else: send an event
events.send(MyEvent { value: 1 });
// somewhere else: read the events
for event in reader.iter(&events) {
assert_eq!(event.value, 1)
}
// events are only processed once per reader
assert_eq!(reader.iter(&events).count(), 0);
Details
Events
is implemented using a variation of a double buffer strategy.
Each call to update
swaps buffers and clears out the oldest one.
EventReader
s will read events from both buffers.EventReader
s that read at least once per update will never drop events.EventReader
s that read once within two updates might still receive some eventsEventReader
s that read after two updates are guaranteed to drop all events that occurred before those updates.
The buffers in Events
will grow indefinitely if update
is never called.
An alternative call pattern would be to call update
manually across frames to control when events are cleared.
This complicates consumption and risks ever-expanding memory usage if not cleaned up,
but can be done by adding your event as a resource instead of using
add_event
.
Implementations
sourceimpl<T: Resource> Events<T>
impl<T: Resource> Events<T>
sourcepub fn send(&mut self, event: T)
pub fn send(&mut self, event: T)
“Sends” an event
by writing it to the current event buffer. EventReader
s can then read
the event.
sourcepub fn send_default(&mut self) where
T: Default,
pub fn send_default(&mut self) where
T: Default,
Sends the default value of the event. Useful when the event is an empty struct.
sourcepub fn get_reader(&self) -> ManualEventReader<T>
pub fn get_reader(&self) -> ManualEventReader<T>
Gets a new ManualEventReader
. This will include all events already in the event buffers.
sourcepub fn get_reader_current(&self) -> ManualEventReader<T>
pub fn get_reader_current(&self) -> ManualEventReader<T>
Gets a new ManualEventReader
. This will ignore all events already in the event buffers.
It will read all future events.
sourcepub fn update(&mut self)
pub fn update(&mut self)
Swaps the event buffers and clears the oldest event buffer. In general, this should be called once per frame/update.
sourcepub fn update_system(events: ResMut<'_, Self>)
pub fn update_system(events: ResMut<'_, Self>)
A system that calls Events::update
once per frame.
sourcepub fn drain(&mut self) -> impl Iterator<Item = T> + '_
pub fn drain(&mut self) -> impl Iterator<Item = T> + '_
Creates a draining iterator that removes all events.
sourcepub fn iter_current_update_events(&self) -> impl DoubleEndedIterator<Item = &T>
pub fn iter_current_update_events(&self) -> impl DoubleEndedIterator<Item = &T>
Iterates over events that happened since the last “update” call.
WARNING: You probably don’t want to use this call. In most cases you should use an
EventReader
. You should only use this if you know you only need to consume events
between the last update()
call and your call to iter_current_update_events
.
If events happen outside that window, they will not be handled. For example, any events that
happen after this call and before the next update()
call will be dropped.
Trait Implementations
sourceimpl<T> Extend<T> for Events<T>
impl<T> Extend<T> for Events<T>
sourcefn extend<I>(&mut self, iter: I) where
I: IntoIterator<Item = T>,
fn extend<I>(&mut self, iter: I) where
I: IntoIterator<Item = T>,
Extends a collection with the contents of an iterator. Read more
sourcefn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)Extends a collection with exactly one element.
sourcefn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)Reserves capacity in a collection for the given number of additional elements. Read more
Auto Trait Implementations
impl<T> RefUnwindSafe for Events<T> where
T: RefUnwindSafe,
impl<T> Send for Events<T> where
T: Send,
impl<T> Sync for Events<T> where
T: Sync,
impl<T> Unpin for Events<T> where
T: Unpin,
impl<T> UnwindSafe for Events<T> where
T: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> Downcast for T where
T: Any,
impl<T> Downcast for T where
T: Any,
sourcefn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Convert Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read more
sourcefn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
sourcefn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert &Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read more
sourcefn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert &mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read more
sourceimpl<T> DowncastSync for T where
T: Any + Send + Sync,
impl<T> DowncastSync for T where
T: Any + Send + Sync,
sourceimpl<T> FromWorld for T where
T: Default,
impl<T> FromWorld for T where
T: Default,
sourcefn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self
using data from the given World
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more