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:
@@ -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>();
|
||||
|
||||
Reference in New Issue
Block a user