Keep the texture tab smooth with many collision outlines (#220)
With a large sheet the texture tab stalled on every mouse move. A
profile over a pan with 1728 frames showed two causes. Half of the time
went into convexPieces, which split every outline into convex pieces
only to pick its colour. And every pointer move during a pan rebuilt
and re-tessellated the whole overlay geometry.
- TextureCanvas draws on two layers. `sheet` holds every frame except
the selected one and is rebuilt only when the zoom, the selection or
one of those frames changes. `overlay` holds the selected frame, its
handles and the rubber band of a new frame.
- Both layers are drawn without the pan. A pan only moves the
container and places the name labels again.
- SheetCanvas has a new hook `panned()`. By default it calls `redraw()`
as before, so Pixel Art and Vector Art are unchanged.
- The validity of an outline is remembered per outline and comes from
polygonProblem, with the same result. This works because the model
replaces an outline list on every change and never edits it in
place, the same as frameOutline.ts already relies on.
- The name plates stay below the outlines and the texts on top. Checked
on a screenshot: the corner handle next to a label sits on top.
- New debug hook `__gm.texture.drawInfo()` with the rebuild count, the
outline count and the screen positions of outlines and names.
Measured with a throwaway probe, 1728 frames, 120 moves, main thread
time per move, before and after in the same browser:
- Middle-click pan: 76.9 ms -> 4.7 ms (4.4 ms without frames)
- Dragging a frame: 51.7 ms -> 10.1 ms
- Wheel zoom: 52.2 ms -> 30.9 ms
- Selecting another frame: 67.6 ms -> 41.0 ms
Findings:
- Wheel zoom and selection still rebuild `sheet` once on purpose. That
stays a single hitch per notch or click on very large sheets.
Tests:
- ./check.sh: 148 files, 2214 tests, CHECK EXIT 0.
- e2e 1-16,37,39-43 on the final build: ALL PASSED, 641 checks.
- Three new checks in 42c-ii. A corner drag does not rebuild the other
frames. An undo on an unselected frame reaches the picture (1 -> 2
outlines). A pan moves outlines and names by exactly 40/25 px without
a rebuild.
- Counter-checks: a missing outline in the cache key and a pan that
does not move each fail at their check. The selected frame in the
key fails alone with 9 rebuilds during an 8-step drag.
- Check total 1333 -> 1336 (confirmed by CI at ceaa44e, task 259).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ceaa44e5b8
commit
fd6af84474
5 files changed
+179
-46
No files matched your search
@@ -15,6 +15,8 @@ export function documentHooks({ state, editor }: HookContext) {
|
||||
rect: () => textureEditor.canvasRect(),
|
||||
/** Whether a press edits the selected frame's collision outline (#141). */
|
||||
collisionMode: () => textureEditor.canvas.collisionMode,
|
||||
/** Rebuilds of the unselected frames' marks, their outlines, and where marks and names sit (#220). */
|
||||
drawInfo: () => textureEditor.canvas.drawInfo,
|
||||
/** The open "Generate collision…" dialog (#161), or null. */
|
||||
generateDialog: () => textureEditor.generateDialog.current()?.info ?? null,
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user