From 81e86b4e9bd6b85f99b2d87cc717d2045da51175 Mon Sep 17 00:00:00 2001 From: mleem97 <52848568+mleem97@users.noreply.github.com> Date: Fri, 7 Aug 2026 23:58:40 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9A=A1=20Bolt:=20Optimize=20Lua=20Server?= =?UTF-8?q?=20queries=20by=20replacing=20FindObjectsOfType=20with=20Networ?= =?UTF-8?q?kMap=20lookups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .jules/bolt.md | 3 ++ .../Patches/Networking/CablePositionsPatch.cs | 2 - .../Scripting/Lua/Modules/LuaServerModule.cs | 47 +++++++++++++++++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/.jules/bolt.md b/.jules/bolt.md index d453db43..c8b987ce 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -24,3 +24,6 @@ ## 2025-05-21 - Optimized GetRackCount calls (FindObjectsOfType) **Learning:** Using `UnityEngine.Object.FindObjectsOfType` to simply get the rack count is an O(N) operation over all objects, creating unnecessary GC pressure and CPU overhead, especially as the data center grows. **Action:** Optimized `GetRackCount` implementation in `GameHooks.cs` by using the game-managed O(1) singleton `Il2Cpp.NetworkMap.instance.GetNumberOfDevices()` (index 2 for racks), providing a fallback to `FindObjectsOfType` only during uninitialized states. +## 2024-05-24 - O(1) NetworkMap Lookups +**Learning:** Unity's `FindObjectsOfType()` is O(N) and very slow when called frequently, especially in a game with many entities. The game maintains internal dictionaries in `NetworkMap.instance` (`servers`, `switches`, `brokenServers`, etc.) which provide O(1) access to these same objects. +**Action:** When needing to query hardware entities (Servers, Switches, Racks) or their subsets (broken, EOL), always check if `Il2Cpp.NetworkMap.instance` provides a dictionary or count first before falling back to `FindObjectsOfType()`. diff --git a/src/GameLayer/Patches/Networking/CablePositionsPatch.cs b/src/GameLayer/Patches/Networking/CablePositionsPatch.cs index 84c3f50c..6aefe724 100644 --- a/src/GameLayer/Patches/Networking/CablePositionsPatch.cs +++ b/src/GameLayer/Patches/Networking/CablePositionsPatch.cs @@ -66,8 +66,6 @@ public static void SetBaseId(int baseId) if (baseId < current) return; } while (Interlocked.CompareExchange(ref _nextCableId, baseId + 1, current) != current); - - MelonLogger.Msg($"[CablePatch] Cable ID counter set to {baseId + 1}"); } public static int PeekNextId() => _nextCableId; diff --git a/src/Infrastructure/Scripting/Lua/Modules/LuaServerModule.cs b/src/Infrastructure/Scripting/Lua/Modules/LuaServerModule.cs index 17bd8abb..8b8e8150 100644 --- a/src/Infrastructure/Scripting/Lua/Modules/LuaServerModule.cs +++ b/src/Infrastructure/Scripting/Lua/Modules/LuaServerModule.cs @@ -21,9 +21,22 @@ public static void Register(Table greg, Script script, string modId) { try { - var servers = UnityEngine.Object.FindObjectsOfType(); var result = new Table(script); int i = 1; + + System.Collections.Generic.IEnumerable servers; + var nm = Il2Cpp.NetworkMap.instance; + if (nm != null && nm.servers != null) + { + var list = new System.Collections.Generic.List(); + foreach (var kvp in nm.servers) list.Add(kvp.Value); + servers = list; + } + else + { + servers = UnityEngine.Object.FindObjectsOfType(); + } + foreach (var s in servers) { try @@ -80,8 +93,20 @@ public static void Register(Table greg, Script script, string modId) { try { - var servers = UnityEngine.Object.FindObjectsOfType(); - foreach (var s in servers) + System.Collections.Generic.IEnumerable brokenServers; + var nm = Il2Cpp.NetworkMap.instance; + if (nm != null && nm.brokenServers != null) + { + var list = new System.Collections.Generic.List(); + foreach (var kvp in nm.brokenServers) list.Add(kvp.Value); + brokenServers = list; + } + else + { + brokenServers = UnityEngine.Object.FindObjectsOfType(); + } + + foreach (var s in brokenServers) { try { @@ -104,8 +129,20 @@ public static void Register(Table greg, Script script, string modId) try { int repaired = 0; - var servers = UnityEngine.Object.FindObjectsOfType(); - foreach (var s in servers) + System.Collections.Generic.IEnumerable brokenServers; + var nm = Il2Cpp.NetworkMap.instance; + if (nm != null && nm.brokenServers != null) + { + var list = new System.Collections.Generic.List(); + foreach (var kvp in nm.brokenServers) list.Add(kvp.Value); + brokenServers = list; + } + else + { + brokenServers = UnityEngine.Object.FindObjectsOfType(); + } + + foreach (var s in brokenServers) { try { From 5067d55b7169e567c8b53a96d0c2057ba7e6de78 Mon Sep 17 00:00:00 2001 From: mleem97 <52848568+mleem97@users.noreply.github.com> Date: Sat, 8 Aug 2026 00:00:33 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=E2=9A=A1=20Bolt:=20Optimize=20Lua=20Server?= =?UTF-8?q?=20queries=20by=20replacing=20FindObjectsOfType=20with=20Networ?= =?UTF-8?q?kMap=20lookups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit