From 7e76aace1b719f60934f8a020c62fe694673923f Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 23 Apr 2026 12:55:58 +0200 Subject: [PATCH] WIP a --- frontend/src/app/render_wasm/api.cljs | 11 +++++++++-- render-wasm/src/render.rs | 8 +++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index 96c3253c64..a911d3a41e 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -1575,10 +1575,17 @@ (def ^:private default-context-options #js {:antialias false - :depth true + ;; Depth is not needed for 2D canvas rendering and can add driver work. + :depth false :stencil true :alpha true - "preserveDrawingBuffer" true}) + ;; Preserving the drawing buffer forces extra GPU/driver work and can + ;; stall every frame; we re-render explicitly so it is unnecessary for + ;; the viewport and hurts FPS during interactions like drag. + "preserveDrawingBuffer" false + ;; Hint the browser/ANGLE to reduce compositor-induced stalls. + "desynchronized" true + "powerPreference" "high-performance"}) (defn resize-viewbox [width height] diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 0d249f06e7..fff0bc1338 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -1768,6 +1768,7 @@ impl RenderState { performance::end_measure!("start_render_loop"); performance::end_timed_log!("start_render_loop", _start); + Ok(()) } @@ -1826,7 +1827,12 @@ impl RenderState { // still need to flush every rAF so the user sees the updated // shape position — render_from_cache is not in the loop here. if !self.options.is_viewport_interaction() { - self.flush_and_submit(); + // self.gpu_state.context.flush_and_submit(); + if self.options.is_interactive_transform() { + self.gpu_state.context.flush_and_submit(); + } else { + self.flush_and_submit(); + } } else { self.gpu_state.context.flush_and_submit(); }