Skip to content

Commit cce06fc

Browse files
committed
Reduced memory allocations in the Observer system
1 parent 0afd693 commit cce06fc

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

MLAPI/MonoBehaviours/Core/NetworkedObject.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ public bool isSpawned
134134
internal bool? sceneObject = null;
135135

136136
public HashSet<uint> observers = new HashSet<uint>();
137+
private HashSet<uint> previousObservers = new HashSet<uint>();
137138

138139
internal void RebuildObservers(uint? clientId = null)
139140
{
@@ -155,15 +156,16 @@ internal void RebuildObservers(uint? clientId = null)
155156
}
156157
else
157158
{
158-
HashSet<uint> previousObservers = new HashSet<uint>(observers);
159-
HashSet<uint> newObservers = new HashSet<uint>();
159+
previousObservers.Clear();
160+
foreach (var item in observers)
161+
previousObservers.Add(item);
162+
observers.Clear();
160163
bool update = false;
161164
for (int i = 0; i < childNetworkedBehaviours.Count; i++)
162165
{
163-
bool changed = childNetworkedBehaviours[i].OnRebuildObservers(newObservers);
166+
bool changed = childNetworkedBehaviours[i].OnRebuildObservers(observers);
164167
if (changed)
165168
{
166-
observers = newObservers;
167169
update = true;
168170
break;
169171
}
@@ -174,8 +176,8 @@ internal void RebuildObservers(uint? clientId = null)
174176
{
175177
if (pair.Key == NetworkingManager.singleton.NetworkConfig.NetworkTransport.HostDummyId)
176178
continue;
177-
if ((previousObservers.Contains(pair.Key) && !newObservers.Contains(pair.Key)) ||
178-
(!previousObservers.Contains(pair.Key) && newObservers.Contains(pair.Key)))
179+
if ((previousObservers.Contains(pair.Key) && !observers.Contains(pair.Key)) ||
180+
(!previousObservers.Contains(pair.Key) && observers.Contains(pair.Key)))
179181
{
180182
//Something changed for this client.
181183
using (BitWriter writer = new BitWriter())
@@ -189,6 +191,11 @@ internal void RebuildObservers(uint? clientId = null)
189191
}
190192
}
191193
}
194+
else
195+
{
196+
foreach (var item in previousObservers)
197+
observers.Add(item);
198+
}
192199
}
193200
}
194201

MLAPI/MonoBehaviours/Prototyping/NetworkedProximity.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ public override bool OnCheckObserver(uint newClientId)
4747
return (pos - transform.position).magnitude < Range;
4848
}
4949

50+
private Collider[] colliders = new Collider[32];
51+
private Collider2D[] colliders2d = new Collider2D[32];
5052
public override bool OnRebuildObservers(HashSet<uint> observers)
5153
{
5254
if (ForceHidden)
@@ -61,21 +63,35 @@ public override bool OnRebuildObservers(HashSet<uint> observers)
6163
{
6264
case CheckMethod.Physics3D:
6365
{
64-
var hits = Physics.OverlapSphere(transform.position, Range);
65-
for (int i = 0; i < hits.Length; i++)
66+
int hits = Physics.OverlapSphereNonAlloc(transform.position, Range, colliders);
67+
//We check if it's equal to since the OverlapSphereNonAlloc only returns what it actually wrote, not what it found.
68+
if (hits >= colliders.Length)
6669
{
67-
var uv = hits[i].GetComponent<NetworkedObject>();
70+
//Resize colliders array
71+
colliders = new Collider[(int)((hits + 2)* 1.3f)];
72+
hits = Physics.OverlapSphereNonAlloc(transform.position, Range, colliders);
73+
}
74+
for (int i = 0; i < hits; i++)
75+
{
76+
var uv = colliders[i].GetComponent<NetworkedObject>();
6877
if (uv != null && uv.isPlayerObject)
6978
observers.Add(uv.OwnerClientId);
7079
}
7180
return true;
7281
}
7382
case CheckMethod.Physics2D:
7483
{
75-
var hits = Physics2D.OverlapCircleAll(transform.position, Range);
76-
for (int i = 0; i < hits.Length; i++)
84+
int hits = Physics2D.OverlapCircleNonAlloc(transform.position, Range, colliders2d);
85+
//We check if it's equal to since the OverlapSphereNonAlloc only returns what it actually wrote, not what it found.
86+
if (hits >= colliders.Length)
87+
{
88+
//Resize colliders array
89+
colliders2d = new Collider2D[(int)((hits + 2) * 1.3f)];
90+
hits = Physics2D.OverlapCircleNonAlloc(transform.position, Range, colliders2d);
91+
}
92+
for (int i = 0; i < hits; i++)
7793
{
78-
var uv = hits[i].GetComponent<NetworkedObject>();
94+
var uv = colliders2d[i].GetComponent<NetworkedObject>();
7995
if (uv != null && (uv.isPlayerObject))
8096
observers.Add(uv.OwnerClientId);
8197
}

0 commit comments

Comments
 (0)