Commit Graph
4 Commits
Author SHA1 Message Date
ausboss 699208dadc Prepare 2.0.0 release candidate 2026-09-07 19:56:23 -05:00
ausboss 41ad62853b Apply the measured performance follow-ups from the review
Morphology first, because three things stand on it: grow_shrink_mask now
dilates or erodes in one separable pass - n 3x3 max pools equal a single
(2n+1) square filter, which splits into two 1-D passes - instead of one
full-image pool per pixel of growth. Bit-identical on hard and soft
masks in both directions (asserted against the old iterated form), and
measured 6-7x at 32 px. The matting trimap, which was rebuilding that
morphology inside its per-frame loop, builds it once per batch: 11.0 s
of trimap work on 48 frames of 832x480 becomes 0.4 s.

Pad Image's pillarbox backdrop blurs at quarter resolution when sigma is
large enough that the blur destroys detail anyway - that one blur was
~90% of the node's runtime, and the low-res path is 6-7x cheaper with a
mean difference around 0.001 in a band that is then dimmed. Light blurs
stay on the exact full-resolution path, so small canvases (and the
existing tests) are unchanged.

Frame Interpolate estimates flow exactly once per source pair at every
batch_size: blend batches now take whole (a, b) groups, and a one-batch
flow cache covers a pair a tiny batch_size splits, so batch_size=1 - the
setting the tooltip recommends for limited VRAM - no longer re-solves
each pair once per output frame (4x the RAFT work at 24 -> 120 fps).
The counting-stub test pins solves to the unique-pair count and checks
outputs across batch sizes with a content-dependent flow, a tolerance a
deliberately poisoned cache overshoots by five orders of magnitude.

Smaller: the guide-image batch is validated as a view and converted per
frame instead of duplicated up front (398 MB resident for 16 frames of
1080p); the scene-cut scan reuses its subtraction temporary in place;
and the edge-halo spread drops EDGE_HALO_SPREAD_PIXELS - tuned to 0 and
provably a no-op - along with the full-batch alpha copy that rode on it,
clamping per frame instead so values are unchanged.
2026-08-15 20:25:15 -05:00
ausboss 5e6cdb2ecc Fix the fifteen defects the review found
Frame Chooser, mostly. A pause did not survive a workflow load: LiteGraph
clears a graph by removing every node, so undo, a tab switch, Clear
Workflow and opening another file all fired the teardown a deleted node
uses to release its pause, and killed a run that was still going. That
now only fires for a real deletion. Answering "keep all" wrote the batch
out as 1,2,...,N into pick_list, so the next run dropped whatever the
enumeration did not reach or failed outright on a shorter clip; it
writes the empty answer it was given. And pick_list is only written back
under "keep last selection" - it pre-answers the node, so filling it in
automatically meant a chooser left at the default paused exactly once.

Refine Mask: smooth applies only the change it made to the jaggy edge
rather than binarizing everything, so an already-soft matte keeps its
alpha (binary masks stay bit-identical), and blur now reaches the
matting solve instead of being thresholded back out of the trimap.

Frame Interpolate's copy path honours batch_size; it gathered every
copied frame at once, which on a long clip at an integer multiple was a
multi-gigabyte allocation on the frames device that no setting bounded.

Subgraph execution ids are resolved by walking the chain instead of
stripping the prefix, which could match an unrelated node with the same
number. Status and runtime badges appear inside subgraphs again, and a
subgraph pause renders on the node that actually paused.

Also: the Custom colour scheme no longer strips every node's colour when
its stored colour is unreadable; Drop Shadow and Pad Image name their
own widget for an unreadable colour instead of blaming Transform; a
non-ASCII token and a non-object JSON body answer 400 rather than
throwing a 500 and stranding the pause; pick_list rejects Unicode
digits, which used to raise during validation or silently read as a
frame nobody typed.

Tooling: validate_nodes parses NODE_MODULES rather than matching it
anywhere in the text, and an unregistered module is an error - it used
to exit 0 printing nothing. It also refuses mapping keys declared
outside nodes/, which is how the registry fixtures came to be advertised
to ComfyUI-Manager as installable nodes; they are .py.txt now. And the
video test no longer leaves ComfyUI on sys.path, which was flipping
every fail-soft seam for whatever ran next.
2026-08-15 00:00:15 -05:00
ausboss 2f034c61ee Add FPS-aware frame interpolation 2026-08-13 17:55:49 -05:00