Struct bevy_internal::app::Events[][src]

pub struct Events<T> { /* fields omitted */ }
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.

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 App::add_event. EventReaders 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 double buffer. Each call to Events::update swaps buffers and clears out the oldest buffer. EventReaders that read at least once per update will never drop events. EventReaders that read once within two updates might still receive some events. EventReaders that read after two updates are guaranteed to drop all events that occurred before those updates.

The buffers in Events will grow indefinitely if Events::update is never called.

An alternative call pattern would be to call Events::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 App::add_event.

Implementations

“Sends” an event by writing it to the current event buffer. EventReaders can then read the event.

Gets a new ManualEventReader. This will include all events already in the event buffers.

Gets a new ManualEventReader. This will ignore all events already in the event buffers. It will read all future events.

Swaps the event buffers and clears the oldest event buffer. In general, this should be called once per frame/update.

A system that calls Events::update once per frame.

Removes all events.

Returns true if there are no events in this collection.

Creates a draining iterator that removes all events.

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

Formats the value using the given formatter. Read more

Returns the “default value” for a type. Read more

Extends a collection with the contents of an iterator. Read more

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

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

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

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s. Read more

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

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait. Read more

Performs the conversion.

Creates Self using data from the given World

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more