Skip to content

Commit 500929c

Browse files
committed
perf(desktop): streamline continuous resize rendering
1 parent d66a9dc commit 500929c

2 files changed

Lines changed: 17 additions & 18 deletions

File tree

crates/jcode-desktop/src/canvas.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,11 @@ impl Canvas {
484484
self.primitive_vertices_cache.clear();
485485
self.primitive_frame_vertices.clear();
486486
self.primitive_caret_vertices.clear();
487-
self.workspace_text_pane_cache.clear();
487+
// Keep workspace pane entries across resizes. Their identity keys include
488+
// the panel dimensions, so the next render refreshes any size-sensitive
489+
// text and geometry while retaining the previous buffers for compatible
490+
// layout buckets. Clearing here made every intermediate resize frame a
491+
// cold render and dropped all glyph/vertex allocations.
488492
self.app_mode_transition.clear();
489493
self.app_mode_transition_vertices.clear();
490494
self.single_session_scroll_motion.clear();

crates/jcode-desktop/src/main.rs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -560,27 +560,10 @@ async fn run() -> Result<()> {
560560
WindowEvent::CloseRequested => target.exit(),
561561
WindowEvent::Resized(size) => {
562562
pending_resize = Some(size);
563-
forward_app_worker_input(
564-
&mut hot_reloader,
565-
DesktopInputEvent::Window(DesktopWindowEvent::Resized {
566-
width: size.width,
567-
height: size.height,
568-
scale_factor: window.scale_factor() as f32,
569-
}),
570-
);
571563
window.request_redraw();
572564
}
573565
WindowEvent::ScaleFactorChanged { .. } => {
574566
pending_resize = Some(window.inner_size());
575-
let size = window.inner_size();
576-
forward_app_worker_input(
577-
&mut hot_reloader,
578-
DesktopInputEvent::Window(DesktopWindowEvent::Resized {
579-
width: size.width,
580-
height: size.height,
581-
scale_factor: window.scale_factor() as f32,
582-
}),
583-
);
584567
window.request_redraw();
585568
}
586569
WindowEvent::Focused(focused) => {
@@ -1229,6 +1212,18 @@ async fn run() -> Result<()> {
12291212
};
12301213
if let Some(size) = pending_resize.take() {
12311214
canvas.resize(size);
1215+
// Winit may deliver many resize events between presented
1216+
// frames. Forward only the newest dimensions so the app
1217+
// worker does not rebuild and serialize a discarded scene
1218+
// for every intermediate event.
1219+
forward_app_worker_input(
1220+
&mut hot_reloader,
1221+
DesktopInputEvent::Window(DesktopWindowEvent::Resized {
1222+
width: size.width,
1223+
height: size.height,
1224+
scale_factor: window.scale_factor() as f32,
1225+
}),
1226+
);
12321227
}
12331228
let window_size = window.inner_size();
12341229
if !desktop_surface_size_is_renderable(window_size) {

0 commit comments

Comments
 (0)