Less garbage, fewer GC hitches: no Joint array per part every 0.5 s, cheap aim check after clicks, cached FPS/ping/chat labels; perf report measures object sync, vehicle fx and part/bolt sync correctly

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Nico Meister
2026-10-05 16:31:56 +02:00
co-authored by Claude Opus 5.5
parent fe08fa5213
commit d567d5992a
4 changed files with 71 additions and 21 deletions
+11 -3
View File
@@ -811,15 +811,23 @@ namespace MSCO
return attached;
}
static bool IsAttached(SyncedBody b)
bool IsAttached(SyncedBody b)
{
if (b.IsVehicle || b.Rb == null) return false;
// Unter einem anderen Rigidbody (z.B. am Auto eingehängt)
for (Transform p = b.Rb.transform.parent; p != null; p = p.parent)
if (p.GetComponent<Rigidbody>() != null) return true;
// Per Gelenk mit etwas verbunden, das nicht der Spieler ist (die Hand hält Items nicht über Gelenke fest)
// Per Gelenk mit etwas verbunden, das nicht der Spieler ist (die Hand hält Items nicht über Gelenke fest).
// Läuft alle 0,5 s für jedes Teil: erst billig prüfen, ob es überhaupt ein Gelenk hat (GetComponents legt
// jedes Mal ein neues Array an - die allermeisten Teile haben keins).
if (b.Rb.GetComponent<Joint>() == null) return false;
Transform playerRoot = Head != null ? Head.root : null;
foreach (Joint j in b.Rb.GetComponents<Joint>())
if (j != null && j.connectedBody != null && j.connectedBody.transform.root.name != "PLAYER") return true;
{
if (j == null || j.connectedBody == null) continue;
Transform root = j.connectedBody.transform.root;
if (playerRoot != null ? root != playerRoot : root.name != "PLAYER") return true;
}
return false;
}