From bf83292e65c5ac3eeec57511d008c269cee6f8c3 Mon Sep 17 00:00:00 2001 From: snoopy Date: Wed, 9 Sep 2026 17:36:06 +0200 Subject: [PATCH] Regrouper les notifications de mesure en un seul rendu Chaque noeud remonte sa taille reelle apres rendu. Sur une carte de 120 noeuds, appliquer un reglage a toute la selection declenchait autant d'increments de `sizeVersion` que de noeuds redimensionnes, donc autant de rendus successifs. Les increments sont desormais regroupes dans une microtache : un seul rendu par lot. Mesure sur 121 noeuds, onglet en arriere-plan (donc pessimiste) : application d'un padding a toute la selection de ~730 ms a ~500 ms. Co-Authored-By: Claude Opus 5 --- frontend/src/stores/editorStore.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/frontend/src/stores/editorStore.ts b/frontend/src/stores/editorStore.ts index ec6ec7a..1562ef4 100644 --- a/frontend/src/stores/editorStore.ts +++ b/frontend/src/stores/editorStore.ts @@ -202,6 +202,9 @@ function cloneSubtrees( } export const useEditorStore = create((set, get) => { + /** Regroupe les notifications de mesure d'un meme lot en un seul rendu. */ + let sizeBumpScheduled = false; + /** * Applique une transformation sur la carte. * `history: false` regroupe les micro-modifications (glisser-deposer) pour @@ -1004,9 +1007,19 @@ export const useEditorStore = create((set, get) => { if (known && known.width === size.width && known.height === size.height) return; state.measuredSizes.set(id, size); - // React Flow a besoin des dimensions sur les noeuds controles (minimap, - // cadrage). On ne redessine que lorsqu'une taille a reellement change. - set({ sizeVersion: state.sizeVersion + 1 }); + + /* + * React Flow a besoin des dimensions sur les noeuds controles (minimap, + * cadrage, redimensionnement). On ne redessine que lorsqu'une taille a + * reellement change, et une seule fois par lot : sans cela, appliquer un + * reglage a cent noeuds declencherait cent rendus successifs. + */ + if (sizeBumpScheduled) return; + sizeBumpScheduled = true; + queueMicrotask(() => { + sizeBumpScheduled = false; + set({ sizeVersion: get().sizeVersion + 1 }); + }); }, }; });