From 081b3d869d5ce6f0f790f61c870c20a6fcaa515b Mon Sep 17 00:00:00 2001 From: Aceeri Date: Wed, 17 Aug 2022 20:28:25 -0700 Subject: [PATCH 1/3] Warning message for missing events --- crates/bevy_ecs/src/event.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index 04a7e6d74906e..a8d52b075f76b 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -2,7 +2,7 @@ use crate as bevy_ecs; use crate::system::{Local, Res, ResMut, Resource, SystemParam}; -use bevy_utils::tracing::trace; +use bevy_utils::tracing::{trace, warn}; use std::ops::{Deref, DerefMut}; use std::{ fmt::{self}, @@ -149,6 +149,14 @@ impl Default for Events { } } +impl Events { + pub fn oldest_event_count(&self) -> usize { + self.events_a + .start_event_count + .min(self.events_b.start_event_count) + } +} + #[derive(Debug)] struct EventSequence { events: Vec>, @@ -351,10 +359,18 @@ impl ManualEventReader { + ExactSizeIterator)> { // if the reader has seen some of the events in a buffer, find the proper index offset. // otherwise read all events in the buffer + let missed = self.missed_events(events); + if missed > 0 { + let plural = if missed == 1 { "event" } else { "events" }; + let type_name = std::any::type_name::(); + warn!("Missed {missed} `{type_name}` {plural}. Consider reading from the `EventReader` more often or updating the `Events` to update less. This is most likely due to run criteria/fixed timesteps or consuming events conditionally."); + } + let a_index = (self.last_event_count).saturating_sub(events.events_a.start_event_count); let b_index = (self.last_event_count).saturating_sub(events.events_b.start_event_count); let a = events.events_a.get(a_index..).unwrap_or_default(); let b = events.events_b.get(b_index..).unwrap_or_default(); + let unread_count = a.len() + b.len(); // Ensure `len` is implemented correctly debug_assert_eq!(unread_count, self.len(events)); @@ -379,6 +395,11 @@ impl ManualEventReader { .min(events.len()) } + /// Amount of events we missed. + pub fn missed_events(&self, events: &Events) -> usize { + events.oldest_event_count() - self.last_event_count + } + /// See [`EventReader::is_empty`] pub fn is_empty(&self, events: &Events) -> bool { self.len(events) == 0 From 90a619ea5ca33f258437131c833722312b00053e Mon Sep 17 00:00:00 2001 From: Aceeri Date: Wed, 17 Aug 2022 20:39:01 -0700 Subject: [PATCH 2/3] Saturating sub for missed events --- crates/bevy_ecs/src/event.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index a8d52b075f76b..54a482ac129b6 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -397,7 +397,9 @@ impl ManualEventReader { /// Amount of events we missed. pub fn missed_events(&self, events: &Events) -> usize { - events.oldest_event_count() - self.last_event_count + events + .oldest_event_count() + .saturating_sub(self.last_event_count) } /// See [`EventReader::is_empty`] From 3abcfd81db862bf2588cc3e762247dfad0d274f6 Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Mon, 29 Aug 2022 19:12:41 -0700 Subject: [PATCH 3/3] clarify warning --- crates/bevy_ecs/src/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index 54a482ac129b6..47972a4fa46ee 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -363,7 +363,7 @@ impl ManualEventReader { if missed > 0 { let plural = if missed == 1 { "event" } else { "events" }; let type_name = std::any::type_name::(); - warn!("Missed {missed} `{type_name}` {plural}. Consider reading from the `EventReader` more often or updating the `Events` to update less. This is most likely due to run criteria/fixed timesteps or consuming events conditionally."); + warn!("Missed {missed} `{type_name}` {plural}. Consider reading from the `EventReader` more often (generally the best solution) or calling Events::update() less frequently (normally this is called once per frame). This problem is most likely due to run criteria/fixed timesteps or consuming events conditionally. See the Events documentation for more information."); } let a_index = (self.last_event_count).saturating_sub(events.events_a.start_event_count);