Planet.gd calls visual.configure() BEFORE add_child(), and the SceneTree
defers _ready() to the first frame - so configure() built the five rings,
and _ready() then threw them away and built five more. Eighty antialiased
polylines tessellated per black hole instead of forty, plus five nodes
queued for free.
Confirmed by instrumenting _build():
_build() called, existing children=0 <- configure()
_build() called, existing children=5 <- _ready()
_ready() now uses the same is-it-built guard configure() already had.
Note for anyone chasing the same thing: this is NOT the disc's steady-state
cost. Measured, the geometry rasterises zero times over sixty frames (the
NeonPiece refactor works), and rendering the disc costs 0.1 ms against a
133 ms softpipe floor. The disc is cheap once it exists.
172/172.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019AJMdB7iuHuLFZM1aBu3GD