From 8a8d89dfc034218df2341e45ceb01cf1359de0e6 Mon Sep 17 00:00:00 2001 From: Aitor Moreno Date: Thu, 27 Mar 2025 16:14:38 +0100 Subject: [PATCH] :tada: Sort viewport tiles by distance to center --- render-wasm/src/render.rs | 12 +++++++++--- render-wasm/src/render/tiles.rs | 6 ++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 5e913fe4c..ca0068177 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -94,7 +94,7 @@ pub(crate) struct RenderState { pub sampling_options: skia::SamplingOptions, pub render_area: Rect, pub tiles: tiles::TileHashMap, - pub pending_tiles: Vec, + pub pending_tiles: Vec, } impl RenderState { @@ -460,16 +460,20 @@ impl RenderState { ex + interest_delta ey + interest_delta */ + let tile_center = ((ex - sx) / 2, (ey - sy) / 2); self.pending_tiles = vec![]; self.surfaces.cache_clear_visited(); for y in sy..=ey { for x in sx..=ex { let tile = (x, y); - self.pending_tiles.push(tile); + let distance = tiles::manhattan_distance(tile, tile_center); + self.pending_tiles.push((x, y, distance)); self.surfaces.cache_visit(tile); } } self.pending_nodes = vec![]; + // reorder by distance to the center. + self.pending_tiles.sort_by(|a, b| b.2.cmp(&a.2)); self.current_tile = None; self.render_in_progress = true; self.apply_drawing_to_render_canvas(None); @@ -744,7 +748,9 @@ impl RenderState { // If we finish processing every node rendering is complete // let's check if there are more pending nodes - if let Some(next_tile) = self.pending_tiles.pop() { + if let Some(next_tile_with_distance) = self.pending_tiles.pop() { + let (x, y, _) = next_tile_with_distance; + let next_tile = (x, y); self.update_render_context(next_tile); if !self.surfaces.has_cached_tile_surface(next_tile) { if let Some(ids) = self.tiles.get_shapes_at(next_tile) { diff --git a/render-wasm/src/render/tiles.rs b/render-wasm/src/render/tiles.rs index 0b8785195..0062e6ba3 100644 --- a/render-wasm/src/render/tiles.rs +++ b/render-wasm/src/render/tiles.rs @@ -5,9 +5,15 @@ use skia_safe as skia; use std::collections::{HashMap, HashSet}; pub type Tile = (i32, i32); +pub type TileWithDistance = (i32, i32, i32); pub const TILE_SIZE: f32 = 512.; +// @see https://en.wikipedia.org/wiki/Taxicab_geometry +pub fn manhattan_distance(a: (i32, i32), b: (i32, i32)) -> i32 { + (a.0 - b.0).abs() + (a.1 - b.1).abs() +} + pub fn get_tile_dimensions() -> skia::ISize { (TILE_SIZE as i32, TILE_SIZE as i32).into() }