This commit is contained in:
Alejandro Alonso 2026-04-01 11:06:10 +02:00
parent f06b230f24
commit 6dde7a3ec4
2 changed files with 27 additions and 51 deletions

View File

@ -1395,16 +1395,16 @@ impl RenderState {
}
// Draw directly from cache surface, avoiding snapshot overhead
self.surfaces.draw_cache_to_target();
// self.surfaces.draw_cache_to_target();
// Restore canvas state
self.surfaces.canvas(SurfaceId::Target).restore();
// When zooming out, the cached surface (from a previous, more zoomed-in
// render) may not cover the newly visible world area. Fill those gaps
// with any cached tiles (exact zoom or cross-zoom fallback) so we don't
// show temporary empty squares.
if navigate_zoom < 1.0 {
// When zooming out OR panning, the cached surface (from a previous render)
// may not cover the newly visible world area. Fill those gaps with any
// cached tiles (exact zoom or cross-zoom fallback) so we don't show
// temporary empty squares while tiles for the new view are rendering.
// if navigate_zoom <= 1.0 {
let current_scale = self.get_scale();
let current_scale_bits = current_scale.to_bits();
let tiles::TileRect(vsx, vsy, vex, vey) =
@ -1413,11 +1413,6 @@ impl RenderState {
let offset_x = self.viewbox.area.left * current_scale;
let offset_y = self.viewbox.area.top * current_scale;
let mut exact_hits: usize = 0;
let mut fallback_hits: usize = 0;
let mut fallback_blits: usize = 0;
let mut misses: usize = 0;
for x in vsx..=vex {
for y in vsy..=vey {
let tile = tiles::Tile::from(x, y);
@ -1427,17 +1422,19 @@ impl RenderState {
tiles::TILE_SIZE,
tiles::TILE_SIZE,
);
if self.surfaces.has_cached_tile_surface(tile, current_scale_bits) {
if self
.surfaces
.has_cached_tile_surface(tile, current_scale_bits)
{
self.surfaces.draw_cached_tile_surface(
tile,
current_scale_bits,
rect,
self.background_color,
);
exact_hits += 1;
} else {
let target_world_rect = tiles::get_tile_rect(tile, current_scale);
let blits = self.surfaces.draw_tile_fallback_cross_zoom(
let _ = self.surfaces.draw_tile_fallback_cross_zoom(
&self.tile_viewbox,
rect,
self.background_color,
@ -1446,21 +1443,10 @@ impl RenderState {
current_scale_bits,
true,
);
if blits > 0 {
fallback_hits += 1;
fallback_blits += blits;
} else {
misses += 1;
}
}
}
}
eprintln!(
"render_from_cache zoom-out fill: exact_hits={} fallback_tiles={} fallback_blits={} misses={} scale={}",
exact_hits, fallback_hits, fallback_blits, misses, current_scale
);
}
// }
if self.options.is_debug_visible() {
debug::render(self);
@ -2579,7 +2565,10 @@ impl RenderState {
if let Some(current_tile) = self.current_tile {
let scale = self.get_scale();
let scale_bits = scale.to_bits();
if self.surfaces.has_cached_tile_surface(current_tile, scale_bits) {
if self
.surfaces
.has_cached_tile_surface(current_tile, scale_bits)
{
performance::begin_measure!("render_shape_tree::cached");
let tile_rect = self.get_current_tile_bounds()?;
self.surfaces.draw_cached_tile_surface(

View File

@ -676,35 +676,21 @@ impl Surfaces {
target_scale_bits: u32,
debug_trace: bool,
) -> usize {
let Some(candidate_scale_bits) =
self.tiles
.best_fallback_scale_bits(target_scale, target_scale_bits)
let Some(candidate_scale_bits) = self
.tiles
.best_fallback_scale_bits(target_scale, target_scale_bits)
else {
if debug_trace {
println!(
"tile_fallback: no candidate scale (target_scale={})",
target_scale
);
}
return 0;
};
let src_scale = f32::from_bits(candidate_scale_bits);
if !src_scale.is_finite() || src_scale <= 0.0 {
if debug_trace {
println!(
"tile_fallback: invalid candidate scale (bits={}, scale={})",
candidate_scale_bits, src_scale
);
}
return 0;
}
if debug_trace {
println!(
"tile_fallback: target_scale={} -> candidate_scale={}",
target_scale, src_scale
);
}
let tile_size_src_world = super::tiles::get_tile_size(src_scale);
@ -721,7 +707,8 @@ impl Surfaces {
};
let src_world_rect = super::tiles::get_tile_rect(src_tile, src_scale);
let Some(overlap_world) = Self::rect_intersection(target_world_rect, src_world_rect)
let Some(overlap_world) =
Self::rect_intersection(target_world_rect, src_world_rect)
else {
continue;
};
@ -767,10 +754,6 @@ impl Surfaces {
self.tiles.free_tiles(tile_viewbox);
}
if debug_trace {
println!("tile_fallback: blits={}", blits);
}
blits
}
@ -847,6 +830,7 @@ impl TileTextureCache {
}
fn gc(&mut self) {
println!("gc");
// Make a real remove
let removed = std::mem::take(&mut self.removed);
for key in removed.iter() {
@ -897,7 +881,6 @@ impl TileTextureCache {
};
self.scales.insert(scale_bits);
self.grid.insert(key, image);
println!("add: {:?}", key);
self.removed.remove(&key);
}
@ -931,7 +914,11 @@ impl TileTextureCache {
self.grid.len()
}
pub fn best_fallback_scale_bits(&self, target_scale: f32, target_scale_bits: u32) -> Option<u32> {
pub fn best_fallback_scale_bits(
&self,
target_scale: f32,
target_scale_bits: u32,
) -> Option<u32> {
let mut best: Option<(f32, u32)> = None;
for bits in self.scales.iter().copied() {
if bits == target_scale_bits {