From 30c61fd6bc3c1c45156c853ed320312072e24893 Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Tue, 30 Jul 2024 21:43:25 +1200 Subject: Ignore unrequested renders Unrequested renders are detected and ignored to prevent unnecessary rendering work. This was accomplished by keeping track of not just the current render hint, but also keeping track of whether a render has been requested at all. Unrequested renders have been observed while testing on Windows 10. --- src/window.rs | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'src/window.rs') diff --git a/src/window.rs b/src/window.rs index c33f5aa..72ae143 100644 --- a/src/window.rs +++ b/src/window.rs @@ -13,7 +13,7 @@ pub struct Window { surface: softbuffer::Surface, surface_dimensions: Dimensions, #[allow(dead_code)] context: softbuffer::Context, - current_render_hint: RenderHint, + render_request: RenderRequest, previous_cursor_position: Option, } @@ -53,7 +53,7 @@ impl Window { surface, surface_dimensions: Dimensions::ZERO, context, - current_render_hint: RenderHint::Redraw, + render_request: RenderRequest::REDRAW, previous_cursor_position: None, } } @@ -89,7 +89,7 @@ impl Window { self.window.set_min_inner_size(Some(size)); self.window.set_max_inner_size(Some(size)); self.window.set_inner_size(size); - self.current_render_hint = RenderHint::Redraw; + self.render_request = RenderRequest::REDRAW; self.resize_buffer_and_surface(dimensions * pixel_scale); } else { self.window.set_resizable(true); @@ -100,7 +100,7 @@ impl Window { if pixel_scale != self.pixel_scale { let increment = PhysicalSize { width: pixel_scale, height: pixel_scale }; self.window.set_resize_increments(Some(increment)); - self.current_render_hint = RenderHint::Redraw; + self.render_request = RenderRequest::REDRAW; self.resize_buffer_and_surface(self.surface_dimensions); } } @@ -121,7 +121,7 @@ impl Window { if logical_dimensions != self.buffer.dimensions() { self.buffer.resize(logical_dimensions); self.controller.on_resize(logical_dimensions); - self.current_render_hint = RenderHint::Redraw; + self.render_request = RenderRequest::REDRAW; } } @@ -139,9 +139,9 @@ impl Window { pub fn handle_render_request(&mut self) { if let RenderRequest::Render(hint) = self.controller.render_request() { - self.current_render_hint &= hint; + self.render_request &= RenderRequest::Render(hint); self.window.request_redraw(); - } else if self.current_render_hint.is_redraw() { + } else if let RenderRequest::Render(_) = self.render_request { self.window.request_redraw(); } } @@ -157,7 +157,15 @@ impl Window { let scale = self.pixel_scale as usize; let physical_dim = self.surface_dimensions; let logical_dim = self.buffer.dimensions(); - self.controller.on_render(&mut self.buffer, self.current_render_hint); + + // Return early if this render wasn't requested by us. Unrequested + // renders have been observed under Windows 10. + if let RenderRequest::Render(hint) = self.render_request { + self.controller.on_render(&mut self.buffer, hint); + } else { + return; + } + let buffer = self.buffer.as_u32_slice(); let mut surface = self.surface.buffer_mut().unwrap(); @@ -199,8 +207,8 @@ impl Window { } surface.present().unwrap(); - // Reset current_render_hint back to the lowest variant for the next frame. - self.current_render_hint = RenderHint::Update; + // Reset render_request back to the lowest variant for the next frame. + self.render_request = RenderRequest::None; } } -- cgit v1.2.3-70-g09d2