From a948e49e51cb4e751480730bb47f7853aecbb810 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 30 Dec 2025 09:25:29 +0100 Subject: [PATCH] :bug: Fix using cache on first zoom after pan --- render-wasm/src/main.rs | 8 ++++++++ render-wasm/src/render.rs | 11 +++++++++++ render-wasm/src/render/surfaces.rs | 4 ++++ render-wasm/src/state.rs | 4 ++++ 4 files changed, 27 insertions(+) diff --git a/render-wasm/src/main.rs b/render-wasm/src/main.rs index c519e27b6a..9d4ff41617 100644 --- a/render-wasm/src/main.rs +++ b/render-wasm/src/main.rs @@ -275,6 +275,14 @@ pub extern "C" fn set_view_end() { } performance::end_measure!("set_view_end::rebuild_tiles"); performance::end_timed_log!("rebuild_tiles", _rebuild_start); + } else { + // During pan, we only clear the tile index without + // invalidating cached textures, which is more efficient. + let _clear_start = performance::begin_timed_log!("clear_tile_index"); + performance::begin_measure!("set_view_end::clear_tile_index"); + state.clear_tile_index(); + performance::end_measure!("set_view_end::clear_tile_index"); + performance::end_timed_log!("clear_tile_index", _clear_start); } performance::end_measure!("set_view_end"); performance::end_timed_log!("set_view_end", _end_start); diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index e74e59d516..a0763e6d40 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -1962,6 +1962,17 @@ impl RenderState { performance::end_measure!("rebuild_tiles_shallow"); } + /// Clears the tile index without invalidating cached tile textures. + /// This is useful when tile positions don't change (e.g., during pan operations) + /// but the tile index needs to be synchronized. The cached tile textures remain + /// valid since they don't depend on the current view position, only on zoom level. + /// This is much more efficient than clearing the entire cache surface. + pub fn clear_tile_index(&mut self) { + performance::begin_measure!("clear_tile_index"); + self.surfaces.clear_tiles(); + performance::end_measure!("clear_tile_index"); + } + pub fn rebuild_tiles_from(&mut self, tree: ShapesPoolRef, base_id: Option<&Uuid>) { performance::begin_measure!("rebuild_tiles"); diff --git a/render-wasm/src/render/surfaces.rs b/render-wasm/src/render/surfaces.rs index 845410a577..fe0edbb455 100644 --- a/render-wasm/src/render/surfaces.rs +++ b/render-wasm/src/render/surfaces.rs @@ -108,6 +108,10 @@ impl Surfaces { } } + pub fn clear_tiles(&mut self) { + self.tiles.clear(); + } + pub fn resize(&mut self, gpu_state: &mut GpuState, new_width: i32, new_height: i32) { self.reset_from_target(gpu_state.create_target_surface(new_width, new_height)); } diff --git a/render-wasm/src/state.rs b/render-wasm/src/state.rs index 5e48cea05e..40b272007c 100644 --- a/render-wasm/src/state.rs +++ b/render-wasm/src/state.rs @@ -197,6 +197,10 @@ impl<'a> State<'a> { self.render_state.rebuild_tiles_shallow(&self.shapes); } + pub fn clear_tile_index(&mut self) { + self.render_state.clear_tile_index(); + } + pub fn rebuild_tiles(&mut self) { self.render_state.rebuild_tiles_from(&self.shapes, None); }