Fix: PixelArtDevControls is opt-in — it was running OnGUI in Game.unity every frame

The editor-only pixel-art tuner self-spawned via [RuntimeInitializeOnLoadMethod] +
DontDestroyOnLoad into EVERY scene, not just DevSandbox, and its OnGUI draws the
toggle button on every IMGUI pass BEFORE the `!_open` early-out. IMGUI dispatches
at least Layout+Repaint per frame, so it allocated continuously during normal
gameplay — it is a MonoBehaviour, so an ECS system-toggle sweep never touched it,
and it dominated this session's allocation profiling until it was found.

Now gated behind an EditorPrefs opt-in with a checked menu toggle, mirroring
`ProjectM/Boot Into Menu (Editor)`. Off by default.

Separately: because the object carries HideFlags.DontSave it SURVIVES play-mode
exit while the static _instance does not, so the old code leaked one instance per
domain reload — two live strays were found and cleared in the editor.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-13 23:03:15 -07:00
parent 4bd00818e1
commit 150f30f56c
@@ -21,11 +21,33 @@ namespace ProjectM.Client
static PixelArtDevControls _instance;
/// <summary>
/// OPT-IN EditorPref, mirroring `ProjectM/Boot Into Menu (Editor)`. This used to self-spawn into EVERY
/// scene — Game.unity included, not just DevSandbox — and <see cref="OnGUI"/> draws its toggle button on
/// every IMGUI pass BEFORE the `!_open` early-out. IMGUI dispatches at least Layout+Repaint per frame,
/// so it allocated continuously during normal gameplay and dominated allocation profiling until it was
/// found on 2026-08-13. Off by default; enable from the menu when you actually want to tune the look.
/// </summary>
const string EnabledPref = "ProjectM.PixelArtDevControls.Enabled";
const string MenuPath = "ProjectM/Pixel Art Dev Controls (Editor)";
[MenuItem(MenuPath)]
static void ToggleEnabled() => EditorPrefs.SetBool(EnabledPref, !EditorPrefs.GetBool(EnabledPref, false));
[MenuItem(MenuPath, true)]
static bool ToggleEnabledValidate()
{
Menu.SetChecked(MenuPath, EditorPrefs.GetBool(EnabledPref, false));
return true;
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
static void Bootstrap()
{
if (_instance != null)
return;
if (!EditorPrefs.GetBool(EnabledPref, false))
return; // opt-in only — see EnabledPref
var go = new GameObject("~PixelArtDevControls") { hideFlags = HideFlags.HideAndDontSave };
DontDestroyOnLoad(go);
_instance = go.AddComponent<PixelArtDevControls>();