From 04d2c2d1761151455a9fae0e4c8749fcd9adf1cc Mon Sep 17 00:00:00 2001 From: Miguel Medina Ballesteros Date: Tue, 23 Apr 2024 17:47:56 +0200 Subject: [PATCH] Avoid sending multiple redundant RequestRedraws --- src/lib.rs | 7 +++++++ src/systems.rs | 14 ++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f57e1b5b4..51687a97c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -288,6 +288,13 @@ pub struct EguiRenderOutput { pub textures_delta: egui::TexturesDelta, } +impl EguiRenderOutput { + /// Returns `true` if the output has no Egui shapes and no textures delta + pub fn is_empty(&self) -> bool { + self.paint_jobs.is_empty() && self.textures_delta.is_empty() + } +} + /// Is used for storing Egui output. #[derive(Component, Clone, Default)] pub struct EguiOutput { diff --git a/src/systems.rs b/src/systems.rs index 641ee8973..c98e10819 100644 --- a/src/systems.rs +++ b/src/systems.rs @@ -490,6 +490,8 @@ pub fn process_output_system( mut event: EventWriter, #[cfg(windows)] mut last_cursor_icon: Local>, ) { + let mut should_request_redraw = false; + for mut context in contexts.iter_mut() { let ctx = context.ctx.get_mut(); let full_output = ctx.end_frame(); @@ -532,12 +534,8 @@ pub fn process_output_system( #[cfg(not(windows))] set_icon(); - let needs_repaint = !context.render_output.paint_jobs.is_empty() - && !context.render_output.textures_delta.is_empty(); - - if ctx.has_requested_repaint() && needs_repaint { - event.send(RequestRedraw); - } + let needs_repaint = !context.render_output.is_empty(); + should_request_redraw |= ctx.has_requested_repaint() && needs_repaint; #[cfg(feature = "open_url")] if let Some(egui::output::OpenUrl { url, new_tab }) = platform_output.open_url { @@ -558,6 +556,10 @@ pub fn process_output_system( } } } + + if should_request_redraw { + event.send(RequestRedraw); + } } fn egui_to_winit_cursor_icon(cursor_icon: egui::CursorIcon) -> Option {