diff --git a/crates/bevy_render/src/renderer/mod.rs b/crates/bevy_render/src/renderer/mod.rs index f98eb81189375f..73992091ea57ed 100644 --- a/crates/bevy_render/src/renderer/mod.rs +++ b/crates/bevy_render/src/renderer/mod.rs @@ -88,9 +88,16 @@ pub fn render_system(world: &mut World) { // update the time and send it to the app world let time_sender = world.resource::(); - time_sender.0.try_send(Instant::now()).expect( - "The TimeSender channel should always be empty during render. You might need to add the bevy::core::time_system to your app.", - ); + if let Err(error) = time_sender.0.try_send(Instant::now()) { + match error { + bevy_time::TrySendError::Full(_) => { + panic!("The TimeSender channel should always be empty during render. You might need to add the bevy::core::time_system to your app.",); + } + bevy_time::TrySendError::Disconnected(_) => { + // ignore disconnected errors, the main world probably just got dropped during shutdown + } + } + } } /// This queue is used to enqueue tasks for the GPU to execute asynchronously. diff --git a/crates/bevy_time/src/lib.rs b/crates/bevy_time/src/lib.rs index f9b26d480fd2af..61b973b6c9f720 100644 --- a/crates/bevy_time/src/lib.rs +++ b/crates/bevy_time/src/lib.rs @@ -17,6 +17,7 @@ pub use timer::*; use bevy_ecs::system::{Res, ResMut}; use bevy_utils::{tracing::warn, Duration, Instant}; +pub use crossbeam_channel::TrySendError; use crossbeam_channel::{Receiver, Sender}; pub mod prelude {