Use super() *only* when parent logic must run; @onready for nodes accessed multiple times.
Batch heavy loops, yield work across frames to reduce spikes
Move CPU work to threads (WorkerThreadPool); keep scene tree access on main thread
Use async loading; warm up pools on loading screens
Apply object pooling, physics layer/mask filtering, and packed arrays
preload always-needed assets; load/async for optional ones
Split scripts at ~300–500 lines, autoloads at ~200, scenes at 50+ nodes
Use scene inheritance for variants; avoid SubViewport unless essential
Prefer typed signals; minimize per-frame spam; connect editor for static, code for dynamic; pass minimal data; disconnect on free; use EventBus only for global events