From bdea3731e3cf99eb8cb1eba8350d227248a726b9 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Mon, 26 Jan 2026 23:16:50 +0100 Subject: [PATCH 1/6] Only rerender ui if it has changed --- desktop/src/render/state.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/desktop/src/render/state.rs b/desktop/src/render/state.rs index 19b4b40247..a8b689ef5f 100644 --- a/desktop/src/render/state.rs +++ b/desktop/src/render/state.rs @@ -23,6 +23,7 @@ pub(crate) struct RenderState { bind_group: Option, #[derivative(Debug = "ignore")] overlays_scene: Option, + surface_outdated: bool, } impl RenderState { @@ -186,6 +187,7 @@ impl RenderState { ui_texture: None, bind_group: None, overlays_scene: None, + surface_outdated: true, } } @@ -196,6 +198,7 @@ impl RenderState { self.desired_width = width; self.desired_height = height; + self.surface_outdated = true; if width > 0 && height > 0 && (self.config.width != width || self.config.height != height) { self.config.width = width; @@ -241,6 +244,9 @@ impl RenderState { } pub(crate) fn render(&mut self, window: &Window) -> Result<(), RenderError> { + if !self.surface_outdated { + return Ok(()); + } let ui_scale = if let Some(ui_texture) = &self.ui_texture && (self.desired_width != ui_texture.width() || self.desired_height != ui_texture.height()) { @@ -302,11 +308,13 @@ impl RenderState { if ui_scale.is_some() { return Err(RenderError::OutdatedUITextureError); } + self.surface_outdated = false; Ok(()) } fn update_bindgroup(&mut self) { + self.surface_outdated = true; let viewport_texture_view = self.viewport_texture.as_ref().unwrap_or(&self.transparent_texture).create_view(&wgpu::TextureViewDescriptor::default()); let overlays_texture_view = self .overlays_texture From 11f17e5460d1f4373cc77f021ff187ffb6e12d9c Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Mon, 26 Jan 2026 23:56:17 +0100 Subject: [PATCH 2/6] Don't immedeatly request new frame at the end of the event loop --- desktop/src/app.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index c21df6f895..1259212a84 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -557,6 +557,7 @@ impl ApplicationHandler for App { Err(RenderError::SurfaceError(e)) => tracing::error!("Render error: {:?}", e), } let _ = self.start_render_sender.try_send(()); + // self.cef_context.schedule_frame(); } if !self.cef_init_successful @@ -635,7 +636,6 @@ impl ApplicationHandler for App { fn about_to_wait(&mut self, event_loop: &dyn ActiveEventLoop) { // Set a timeout in case we miss any cef schedule requests let timeout = Instant::now() + Duration::from_millis(10); - let wait_until = timeout.min(self.cef_schedule.unwrap_or(timeout)); if let Some(schedule) = self.cef_schedule && schedule < Instant::now() { @@ -644,12 +644,10 @@ impl ApplicationHandler for App { for _ in 0..CEF_MESSAGE_LOOP_MAX_ITERATIONS { self.cef_context.work(); } + } else { + let wait_until = timeout.min(self.cef_schedule.unwrap_or(timeout)); + event_loop.set_control_flow(ControlFlow::WaitUntil(wait_until)); } - if let Some(window) = &self.window.as_ref() { - window.request_redraw(); - } - - event_loop.set_control_flow(ControlFlow::WaitUntil(wait_until)); } } From fa8a4941b1e5292dc54c1e5747929173ea4cfab7 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Tue, 27 Jan 2026 09:55:43 +0100 Subject: [PATCH 3/6] Request redraw after ui update --- desktop/src/app.rs | 3 +++ desktop/src/render/state.rs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index 1259212a84..60eb111e96 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -260,6 +260,9 @@ impl App { if let Some(render_state) = &mut self.render_state { render_state.set_overlays_scene(scene); } + if let Some(window) = &self.window { + window.request_redraw(); + } } DesktopFrontendMessage::PersistenceWriteDocument { id, document } => { self.persistent_data.write_document(id, document); diff --git a/desktop/src/render/state.rs b/desktop/src/render/state.rs index a8b689ef5f..81808cc7ca 100644 --- a/desktop/src/render/state.rs +++ b/desktop/src/render/state.rs @@ -218,14 +218,17 @@ impl RenderState { } pub(crate) fn set_viewport_scale(&mut self, scale: [f32; 2]) { + self.surface_outdated = true; self.viewport_scale = scale; } pub(crate) fn set_viewport_offset(&mut self, offset: [f32; 2]) { + self.surface_outdated = true; self.viewport_offset = offset; } pub(crate) fn set_overlays_scene(&mut self, scene: vello::Scene) { + self.surface_outdated = true; self.overlays_scene = Some(scene); } From 06d751c78a6cad4a09586b88d1de17b82b5156e0 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Mon, 2 Feb 2026 13:53:26 +0100 Subject: [PATCH 4/6] Always request redraw after timeout --- desktop/src/app.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index 60eb111e96..b906159daf 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -6,7 +6,7 @@ use std::thread; use std::time::{Duration, Instant}; use winit::application::ApplicationHandler; use winit::dpi::{PhysicalPosition, PhysicalSize}; -use winit::event::{ButtonSource, ElementState, MouseButton, WindowEvent}; +use winit::event::{ButtonSource, ElementState, MouseButton, StartCause, WindowEvent}; use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop}; use winit::window::WindowId; @@ -636,6 +636,14 @@ impl ApplicationHandler for App { } } + fn new_events(&mut self, event_loop: &dyn ActiveEventLoop, cause: winit::event::StartCause) { + if let StartCause::ResumeTimeReached { .. } = cause + && let Some(window) = &self.window + { + window.request_redraw(); + } + } + fn about_to_wait(&mut self, event_loop: &dyn ActiveEventLoop) { // Set a timeout in case we miss any cef schedule requests let timeout = Instant::now() + Duration::from_millis(10); From 1341c3ade17191a39c4f046505b726e8fbcb404c Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Mon, 2 Feb 2026 14:09:17 +0100 Subject: [PATCH 5/6] Fix setting control flow in all cases --- desktop/src/app.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index b906159daf..adef0db7df 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -646,7 +646,7 @@ impl ApplicationHandler for App { fn about_to_wait(&mut self, event_loop: &dyn ActiveEventLoop) { // Set a timeout in case we miss any cef schedule requests - let timeout = Instant::now() + Duration::from_millis(10); + let mut wait_until = Instant::now() + Duration::from_millis(10); if let Some(schedule) = self.cef_schedule && schedule < Instant::now() { @@ -655,10 +655,10 @@ impl ApplicationHandler for App { for _ in 0..CEF_MESSAGE_LOOP_MAX_ITERATIONS { self.cef_context.work(); } - } else { - let wait_until = timeout.min(self.cef_schedule.unwrap_or(timeout)); - event_loop.set_control_flow(ControlFlow::WaitUntil(wait_until)); + } else if let Some(cef_schedule) = self.cef_schedule { + wait_until = wait_until.min(cef_schedule); } + event_loop.set_control_flow(ControlFlow::WaitUntil(wait_until)); } } From 131b71ef9ddc50cfe1da20b9ab2f5999c30c1c38 Mon Sep 17 00:00:00 2001 From: Timon Date: Tue, 3 Feb 2026 12:06:41 +0000 Subject: [PATCH 6/6] Remove comment --- desktop/src/app.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index adef0db7df..042395831a 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -560,7 +560,6 @@ impl ApplicationHandler for App { Err(RenderError::SurfaceError(e)) => tracing::error!("Render error: {:?}", e), } let _ = self.start_render_sender.try_send(()); - // self.cef_context.schedule_frame(); } if !self.cef_init_successful