In a graph of many nodes the frame rate dropped while panning, and
more so while one node was dragged. Every pointer move rebuilt every
box, every text and every curve, and a drag also announced a changed
project, so the panels rebuilt along with it.
- Panning and zooming move the picture. GraphCanvas.applyView sets
position and scale and draws anew only the grid and the rubber
band. It used to call redraw().
- A node draws its box and makes its texts only when what they show
has changed. NodeView keeps a signature of what redraw reads and
one of what rebuildTexts reads, and returns early while they hold.
- A drag does not announce a changed project. GraphDrags writes the
model on every pointer move and asks the canvas once a frame to
follow (GraphCanvasHost.moved). state.preview() waits for the
command of the release.
- Nodes outside the picture are not drawn. inView in graphView.ts is
the rule, cull() applies it after every redraw and every change of
the view.
- The graph is a render group, and box and pins go into the batch.
The mask sits on a container above the group, on the group itself
it would be panned and zoomed along.
- The rubber band and the drop mark of a dragged behavior are drawn
on their own (drawBand), without a redraw of the graph.
Measured in the CI image with 388 nodes and 540 links, fitted to the
canvas, 240 pointer moves 16 ms apart:
- Pan, script per move: 25.2 ms before, 2.0 ms after
- Pan: 4.4 frames per second before, 18.7 after
- Drag a node: 2.7 frames per second before, 22.4 after
- The still picture: 9 frames per second before, 21 after
Not solved: the still picture of such a graph stays at 21 frames per
second in the test browser. What is left is the drawing itself, and
the frame rates are those of that browser, not of a desktop GPU.
Tests:
- Gate on melektaus-atx: 207 files, 3121 tests (3114 + 7), exit 0
- e2e 4,6,18,19,20,23,24,26,28,31,36,43,51,53 on melektaus-atx: 542
pass, 1 fail. The fail is module 51 after module 43, an order the
suite does not have, and it fails the same way without this
change. Module 51 alone: 12 checks, all pass.
- No full run and no smokes. The sum of 1660 (1656 + 4) is reckoned,
and the CI workflow is switched off.
- Seven unit tests: six for inView in tests/editor/graph-view.test.ts
and one in frame-preview.test.ts
- Four e2e checks in block 6z-xii of module 06: pan, drag, zoom in
and fit, a changed value
- Seven browser counter-probes fail 2 to 3 checks each
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>