mirror of
https://github.com/penpot/penpot.git
synced 2026-07-30 01:46:14 +00:00
Merge pull request #10320 from penpot/superalex-fix-performance-regression-3
🐛 Fix performance regression
This commit is contained in:
commit
c6ecfb7794
@ -1026,10 +1026,6 @@ impl RenderState {
|
||||
self.render_area,
|
||||
);
|
||||
|
||||
let rect = self.get_current_tile_bounds()?;
|
||||
self.surfaces
|
||||
.draw_cached_tile_into_backbuffer(current_tile, &rect);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -2015,24 +2011,6 @@ impl RenderState {
|
||||
self.surfaces
|
||||
.draw_atlas_to_backbuffer(self.viewbox, bg_color);
|
||||
|
||||
// For pure pan (same zoom), overlay any cached per-tile textures on top of the atlas.
|
||||
// This reduces the "rubbery"/distorted look of atlas-only previews while keeping
|
||||
// fast-mode responsive. For zoom, the tile grid changes so cached tiles would be
|
||||
// mispositioned — skip them.
|
||||
if !self.zoom_changed() {
|
||||
let visible_rect = tiles::get_tiles_for_viewbox(&self.viewbox);
|
||||
let offset = self.viewbox.get_offset();
|
||||
for tx in visible_rect.x1()..=visible_rect.x2() {
|
||||
for ty in visible_rect.y1()..=visible_rect.y2() {
|
||||
let tile = tiles::Tile::from(tx, ty);
|
||||
if self.surfaces.has_cached_tile_surface(tile) {
|
||||
let rect = tile.get_rect_with_offset(&offset);
|
||||
self.surfaces.draw_cached_tile_into_backbuffer(tile, &rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.present_frame(shapes);
|
||||
performance::end_measure!("render_from_cache");
|
||||
performance::end_timed_log!("render_from_cache", _start);
|
||||
@ -2105,27 +2083,6 @@ impl RenderState {
|
||||
// Draw directly from cache surface, avoiding snapshot overhead
|
||||
self.surfaces.draw_cache_to_backbuffer();
|
||||
|
||||
// During pure pan (same zoom), draw tiles from the HashMap
|
||||
// on top of the scaled Cache surface. Cached tile textures
|
||||
// include full-quality effects (shadows, blur) from the last
|
||||
// render, so blitting them avoids re-rendering and keeps pan
|
||||
// smooth. During zoom the tile grid changes so HashMap tiles
|
||||
// would be at wrong positions — skip them and let the full
|
||||
// render after set_view_end handle it.
|
||||
if !self.zoom_changed() {
|
||||
let visible_rect = tiles::get_tiles_for_viewbox(&self.viewbox);
|
||||
let offset = self.viewbox.get_offset();
|
||||
for tx in visible_rect.x1()..=visible_rect.x2() {
|
||||
for ty in visible_rect.y1()..=visible_rect.y2() {
|
||||
let tile = tiles::Tile::from(tx, ty);
|
||||
if self.surfaces.has_cached_tile_surface(tile) {
|
||||
let rect = tile.get_rect_with_offset(&offset);
|
||||
self.surfaces.draw_cached_tile_into_backbuffer(tile, &rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.present_frame(shapes);
|
||||
}
|
||||
|
||||
@ -2345,7 +2302,10 @@ impl RenderState {
|
||||
let frame_type =
|
||||
self.render_shape_tree_partial(base_object, tree, timestamp, allow_stop)?;
|
||||
|
||||
if !self.options.is_interactive_transform() {
|
||||
// `draw_atlas` needs a snapshot of the tile atlas. Partial frames are not
|
||||
// presented (only flushed), so defer composition to the final frame and
|
||||
// avoid re-snapshotting up to 4096² on every rAF during async tile work.
|
||||
if !self.options.is_interactive_transform() && matches!(frame_type, FrameType::Full) {
|
||||
self.surfaces.draw_tile_atlas_to_backbuffer(
|
||||
&self.viewbox,
|
||||
&self.tile_viewbox,
|
||||
|
||||
@ -1323,28 +1323,6 @@ impl Surfaces {
|
||||
let _ = self.atlas.clear_tile_in_atlas(gpu_state, tile);
|
||||
}
|
||||
|
||||
pub fn get_tile_image_from_tile_atlas(&mut self, tile: Tile) -> Option<skia::Image> {
|
||||
let Some(tile_ref) = self.tiles.get(tile) else {
|
||||
panic!("Tile not found {}:{}", tile.0, tile.1);
|
||||
};
|
||||
|
||||
let rect = IRect::from_ltrb(
|
||||
tile_ref.rect.left as i32,
|
||||
tile_ref.rect.top as i32,
|
||||
tile_ref.rect.right as i32,
|
||||
tile_ref.rect.bottom as i32,
|
||||
);
|
||||
self.tile_atlas.image_snapshot_with_bounds(rect)
|
||||
}
|
||||
|
||||
pub fn draw_cached_tile_into_backbuffer(&mut self, tile: Tile, rect: &Rect) {
|
||||
if let Some(image) = self.get_tile_image_from_tile_atlas(tile) {
|
||||
// let rect = tile.get_rect_with_offset(&offset);
|
||||
let backbuffer_canvas = self.backbuffer.canvas();
|
||||
backbuffer_canvas.draw_image_rect(&image, None, rect, &skia::Paint::default());
|
||||
}
|
||||
}
|
||||
|
||||
/// Draws the current tile directly to the backbuffer and cache surfaces without
|
||||
/// creating a snapshot. This avoids GPU stalls from ReadPixels but doesn't
|
||||
/// populate the tile texture cache (suitable for one-shot renders like tests).
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user