Skip to content

Commit 3597117

Browse files
becksebenius-unityJesse Olmer
andauthored
fix: MTT-1387 Address GC allocations caused by access to Object.name when recording metrics (#1253)
* MTT-1387 Address GC allocations caused by access to Object.name when recording metrics * reverted minor change (and also fix conventional commit check) * Updated NetworkMetrics to take in a NetworkObject instead of the same pair of parameters for each call Co-authored-by: Jesse Olmer <[email protected]>
1 parent c44c22c commit 3597117

File tree

11 files changed

+76
-94
lines changed

11 files changed

+76
-94
lines changed

com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ internal void __sendServerRpc(FastBufferWriter writer, uint rpcMethodId, ServerR
8989
{
9090
NetworkManager.NetworkMetrics.TrackRpcSent(
9191
NetworkManager.ServerClientId,
92-
NetworkObjectId,
92+
NetworkObject,
9393
rpcMethodName,
9494
__getTypeName(),
9595
rpcMessageSize);
@@ -133,7 +133,7 @@ internal unsafe void __sendClientRpc(FastBufferWriter writer, uint rpcMethodId,
133133
int messageSize;
134134

135135
// We check to see if we need to shortcut for the case where we are the host/server and we can send a clientRPC
136-
// to ourself. Sadly we have to figure that out from the list of clientIds :(
136+
// to ourself. Sadly we have to figure that out from the list of clientIds :(
137137
bool shouldSendToHost = false;
138138

139139
if (rpcParams.Send.TargetClientIds != null)
@@ -183,7 +183,7 @@ internal unsafe void __sendClientRpc(FastBufferWriter writer, uint rpcMethodId,
183183
{
184184
NetworkManager.NetworkMetrics.TrackRpcSent(
185185
client.Key,
186-
NetworkObjectId,
186+
NetworkObject,
187187
rpcMethodName,
188188
__getTypeName(),
189189
messageSize);

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,18 @@ internal set
167167

168168
internal readonly HashSet<ulong> Observers = new HashSet<ulong>();
169169

170+
#if MULTIPLAYER_TOOLS
171+
private string m_CachedNameForMetrics;
172+
#endif
173+
internal string GetNameForMetrics()
174+
{
175+
#if MULTIPLAYER_TOOLS
176+
return m_CachedNameForMetrics ??= name;
177+
#else
178+
return null;
179+
#endif
180+
}
181+
170182
/// <summary>
171183
/// Returns Observers enumerator
172184
/// </summary>
@@ -317,7 +329,7 @@ public void NetworkHide(ulong clientId)
317329
};
318330
// Send destroy call
319331
var size = NetworkManager.SendMessage(message, NetworkDelivery.ReliableSequenced, clientId);
320-
NetworkManager.NetworkMetrics.TrackObjectDestroySent(clientId, NetworkObjectId, name, size);
332+
NetworkManager.NetworkMetrics.TrackObjectDestroySent(clientId, this, size);
321333
}
322334
}
323335

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ChangeOwnershipMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void Handle(ulong senderId, NetworkManager networkManager, int messageSiz
4747
networkObject.InvokeBehaviourOnGainedOwnership();
4848
}
4949

50-
networkManager.NetworkMetrics.TrackOwnershipChangeReceived(senderId, networkObject.NetworkObjectId, networkObject.name, messageSize);
50+
networkManager.NetworkMetrics.TrackOwnershipChangeReceived(senderId, networkObject, messageSize);
5151
}
5252
}
5353
}

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static void Receive(FastBufferReader reader, in NetworkContext context)
2424
public void Handle(ulong senderId, FastBufferReader reader, NetworkManager networkManager)
2525
{
2626
var networkObject = NetworkObject.AddSceneObject(ObjectInfo, reader, networkManager);
27-
networkManager.NetworkMetrics.TrackObjectSpawnReceived(senderId, networkObject.NetworkObjectId, networkObject.name, reader.Length);
27+
networkManager.NetworkMetrics.TrackObjectSpawnReceived(senderId, networkObject, reader.Length);
2828
}
2929
}
3030
}

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/DestroyObjectMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void Handle(ulong senderId, NetworkManager networkManager, int messageSiz
3434
return;
3535
}
3636

37-
networkManager.NetworkMetrics.TrackObjectDestroyReceived(senderId, NetworkObjectId, networkObject.name, messageSize);
37+
networkManager.NetworkMetrics.TrackObjectDestroyReceived(senderId, networkObject, messageSize);
3838
networkManager.SpawnManager.OnDespawnObject(networkObject, true);
3939
}
4040
}

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkVariableDeltaMessage.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,7 @@ public void Serialize(FastBufferWriter writer)
8585

8686
NetworkBehaviour.NetworkManager.NetworkMetrics.TrackNetworkVariableDeltaSent(
8787
ClientId,
88-
NetworkBehaviour.NetworkObjectId,
89-
NetworkBehaviour.name,
88+
NetworkBehaviour.NetworkObject,
9089
NetworkBehaviour.NetworkVariableFields[k].Name,
9190
NetworkBehaviour.__getTypeName(),
9291
writer.Length);
@@ -183,8 +182,7 @@ public void Handle(ulong senderId, FastBufferReader reader, NetworkManager netwo
183182

184183
networkManager.NetworkMetrics.TrackNetworkVariableDeltaReceived(
185184
senderId,
186-
behaviour.NetworkObjectId,
187-
behaviour.name,
185+
networkObject,
188186
behaviour.NetworkVariableFields[i].Name,
189187
behaviour.__getTypeName(),
190188
reader.Length);

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/RpcMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void Handle(FastBufferReader reader, NetworkManager networkManager, ulong
8989
{
9090
networkManager.NetworkMetrics.TrackRpcReceived(
9191
senderId,
92-
Header.NetworkObjectId,
92+
networkObject,
9393
rpcMethodName,
9494
networkBehaviour.__getTypeName(),
9595
reader.Length);

com.unity.netcode.gameobjects/Runtime/Metrics/INetworkMetrics.cs

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ internal interface INetworkMetrics
1414

1515
void TrackNetworkMessageReceived(ulong senderClientId, string messageType, long bytesCount);
1616

17-
void TrackNetworkObject(NetworkObject networkObject);
18-
1917
void TrackNamedMessageSent(ulong receiverClientId, string messageName, long bytesCount);
2018

2119
void TrackNamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, string messageName, long bytesCount);
@@ -30,49 +28,47 @@ internal interface INetworkMetrics
3028

3129
void TrackNetworkVariableDeltaSent(
3230
ulong receiverClientId,
33-
ulong networkObjectId,
34-
string gameObjectName,
31+
NetworkObject networkObject,
3532
string variableName,
3633
string networkBehaviourName,
3734
long bytesCount);
3835

3936
void TrackNetworkVariableDeltaReceived(
4037
ulong senderClientId,
41-
ulong networkObjectId,
42-
string gameObjectName,
38+
NetworkObject networkObject,
4339
string variableName,
4440
string networkBehaviourName,
4541
long bytesCount);
4642

47-
void TrackOwnershipChangeSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, long bytesCount);
43+
void TrackOwnershipChangeSent(ulong receiverClientId, NetworkObject networkObject, long bytesCount);
4844

49-
void TrackOwnershipChangeReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, long bytesCount);
45+
void TrackOwnershipChangeReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount);
5046

51-
void TrackObjectSpawnSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, long bytesCount);
47+
void TrackObjectSpawnSent(ulong receiverClientId, NetworkObject networkObject, long bytesCount);
5248

53-
void TrackObjectSpawnReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, long bytesCount);
49+
void TrackObjectSpawnReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount);
5450

55-
void TrackObjectDestroySent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, long bytesCount);
51+
void TrackObjectDestroySent(ulong receiverClientId, NetworkObject networkObject, long bytesCount);
5652

57-
void TrackObjectDestroyReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, long bytesCount);
53+
void TrackObjectDestroyReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount);
5854

5955
void TrackRpcSent(
6056
ulong receiverClientId,
61-
ulong networkObjectId,
57+
NetworkObject networkObject,
6258
string rpcName,
6359
string networkBehaviourName,
6460
long bytesCount);
6561

6662
void TrackRpcSent(
6763
ulong[] receiverClientIds,
68-
ulong networkObjectId,
64+
NetworkObject networkObject,
6965
string rpcName,
7066
string networkBehaviourName,
7167
long bytesCount);
7268

7369
void TrackRpcReceived(
7470
ulong senderClientId,
75-
ulong networkObjectId,
71+
NetworkObject networkObject,
7672
string rpcName,
7773
string networkBehaviourName,
7874
long bytesCount);

com.unity.netcode.gameobjects/Runtime/Metrics/NetworkMetrics.cs

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ internal class NetworkMetrics : INetworkMetrics
3939
readonly EventMetric<SceneEventMetric> m_SceneEventReceivedEvent = new EventMetric<SceneEventMetric>(NetworkMetricTypes.SceneEventReceived.Id);
4040
private bool m_Dirty;
4141

42-
readonly Dictionary<ulong, NetworkObjectIdentifier> m_NetworkGameObjects = new Dictionary<ulong, NetworkObjectIdentifier>();
43-
4442
public NetworkMetrics()
4543
{
4644
Dispatcher = new MetricDispatcherBuilder()
@@ -77,14 +75,6 @@ public void TrackTransportBytesReceived(long bytesCount)
7775
m_TransportBytesReceived.Increment(bytesCount);
7876
}
7977

80-
public void TrackNetworkObject(NetworkObject networkObject)
81-
{
82-
if (!m_NetworkGameObjects.ContainsKey(networkObject.NetworkObjectId))
83-
{
84-
m_NetworkGameObjects[networkObject.NetworkObjectId] = new NetworkObjectIdentifier(networkObject.name, networkObject.NetworkObjectId);
85-
}
86-
}
87-
8878
public void TrackNetworkMessageSent(ulong receivedClientId, string messageType, long bytesCount)
8979
{
9080
m_NetworkMessageSentEvent.Mark(new NetworkMessageEvent(new ConnectionInfo(receivedClientId), messageType, bytesCount));
@@ -139,16 +129,15 @@ public void TrackUnnamedMessageReceived(ulong senderClientId, long bytesCount)
139129

140130
public void TrackNetworkVariableDeltaSent(
141131
ulong receiverClientId,
142-
ulong networkObjectId,
143-
string gameObjectName,
132+
NetworkObject networkObject,
144133
string variableName,
145134
string networkBehaviourName,
146135
long bytesCount)
147136
{
148137
m_NetworkVariableDeltaSentEvent.Mark(
149138
new NetworkVariableEvent(
150139
new ConnectionInfo(receiverClientId),
151-
new NetworkObjectIdentifier(gameObjectName, networkObjectId),
140+
GetObjectIdentifier(networkObject),
152141
variableName,
153142
networkBehaviourName,
154143
bytesCount));
@@ -157,75 +146,69 @@ public void TrackNetworkVariableDeltaSent(
157146

158147
public void TrackNetworkVariableDeltaReceived(
159148
ulong senderClientId,
160-
ulong networkObjectId,
161-
string gameObjectName,
149+
NetworkObject networkObject,
162150
string variableName,
163151
string networkBehaviourName,
164152
long bytesCount)
165153
{
166154
m_NetworkVariableDeltaReceivedEvent.Mark(
167155
new NetworkVariableEvent(
168156
new ConnectionInfo(senderClientId),
169-
new NetworkObjectIdentifier(gameObjectName, networkObjectId),
157+
GetObjectIdentifier(networkObject),
170158
variableName,
171159
networkBehaviourName,
172160
bytesCount));
173161
MarkDirty();
174162
}
175163

176-
public void TrackOwnershipChangeSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, long bytesCount)
164+
public void TrackOwnershipChangeSent(ulong receiverClientId, NetworkObject networkObject, long bytesCount)
177165
{
178-
m_OwnershipChangeSentEvent.Mark(new OwnershipChangeEvent(new ConnectionInfo(receiverClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
166+
m_OwnershipChangeSentEvent.Mark(new OwnershipChangeEvent(new ConnectionInfo(receiverClientId), GetObjectIdentifier(networkObject), bytesCount));
179167
MarkDirty();
180168
}
181169

182-
public void TrackOwnershipChangeReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, long bytesCount)
170+
public void TrackOwnershipChangeReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount)
183171
{
184172
m_OwnershipChangeReceivedEvent.Mark(new OwnershipChangeEvent(new ConnectionInfo(senderClientId),
185-
new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
173+
GetObjectIdentifier(networkObject), bytesCount));
186174
MarkDirty();
187175
}
188176

189-
public void TrackObjectSpawnSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, long bytesCount)
177+
public void TrackObjectSpawnSent(ulong receiverClientId, NetworkObject networkObject, long bytesCount)
190178
{
191-
m_ObjectSpawnSentEvent.Mark(new ObjectSpawnedEvent(new ConnectionInfo(receiverClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
179+
m_ObjectSpawnSentEvent.Mark(new ObjectSpawnedEvent(new ConnectionInfo(receiverClientId), GetObjectIdentifier(networkObject), bytesCount));
192180
MarkDirty();
193181
}
194182

195-
public void TrackObjectSpawnReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, long bytesCount)
183+
public void TrackObjectSpawnReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount)
196184
{
197-
m_ObjectSpawnReceivedEvent.Mark(new ObjectSpawnedEvent(new ConnectionInfo(senderClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
185+
m_ObjectSpawnReceivedEvent.Mark(new ObjectSpawnedEvent(new ConnectionInfo(senderClientId), GetObjectIdentifier(networkObject), bytesCount));
198186
MarkDirty();
199187
}
200188

201-
public void TrackObjectDestroySent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, long bytesCount)
189+
public void TrackObjectDestroySent(ulong receiverClientId, NetworkObject networkObject, long bytesCount)
202190
{
203-
m_ObjectDestroySentEvent.Mark(new ObjectDestroyedEvent(new ConnectionInfo(receiverClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
191+
m_ObjectDestroySentEvent.Mark(new ObjectDestroyedEvent(new ConnectionInfo(receiverClientId), GetObjectIdentifier(networkObject), bytesCount));
204192
MarkDirty();
205193
}
206194

207-
public void TrackObjectDestroyReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, long bytesCount)
195+
public void TrackObjectDestroyReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount)
208196
{
209-
m_ObjectDestroyReceivedEvent.Mark(new ObjectDestroyedEvent(new ConnectionInfo(senderClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
197+
m_ObjectDestroyReceivedEvent.Mark(new ObjectDestroyedEvent(new ConnectionInfo(senderClientId), GetObjectIdentifier(networkObject), bytesCount));
210198
MarkDirty();
211199
}
212200

213201
public void TrackRpcSent(
214202
ulong receiverClientId,
215-
ulong networkObjectId,
203+
NetworkObject networkObject,
216204
string rpcName,
217205
string networkBehaviourName,
218206
long bytesCount)
219207
{
220-
if (!m_NetworkGameObjects.TryGetValue(networkObjectId, out var networkObjectIdentifier))
221-
{
222-
networkObjectIdentifier = new NetworkObjectIdentifier("", networkObjectId);
223-
}
224-
225208
m_RpcSentEvent.Mark(
226209
new RpcEvent(
227210
new ConnectionInfo(receiverClientId),
228-
networkObjectIdentifier,
211+
GetObjectIdentifier(networkObject),
229212
rpcName,
230213
networkBehaviourName,
231214
bytesCount));
@@ -234,32 +217,27 @@ public void TrackRpcSent(
234217

235218
public void TrackRpcSent(
236219
ulong[] receiverClientIds,
237-
ulong networkObjectId,
220+
NetworkObject networkObject,
238221
string rpcName,
239222
string networkBehaviourName,
240223
long bytesCount)
241224
{
242225
foreach (var receiverClientId in receiverClientIds)
243226
{
244-
TrackRpcSent(receiverClientId, networkObjectId, rpcName, networkBehaviourName, bytesCount);
227+
TrackRpcSent(receiverClientId, networkObject, rpcName, networkBehaviourName, bytesCount);
245228
}
246229
}
247230

248231
public void TrackRpcReceived(
249232
ulong senderClientId,
250-
ulong networkObjectId,
233+
NetworkObject networkObject,
251234
string rpcName,
252235
string networkBehaviourName,
253236
long bytesCount)
254237
{
255-
if (!m_NetworkGameObjects.TryGetValue(networkObjectId, out var networkObjectIdentifier))
256-
{
257-
networkObjectIdentifier = new NetworkObjectIdentifier("", networkObjectId);
258-
}
259-
260238
m_RpcReceivedEvent.Mark(
261239
new RpcEvent(new ConnectionInfo(senderClientId),
262-
networkObjectIdentifier,
240+
GetObjectIdentifier(networkObject),
263241
rpcName,
264242
networkBehaviourName,
265243
bytesCount));
@@ -311,6 +289,11 @@ private void MarkDirty()
311289
{
312290
m_Dirty = true;
313291
}
292+
293+
private static NetworkObjectIdentifier GetObjectIdentifier(NetworkObject networkObject)
294+
{
295+
return new NetworkObjectIdentifier(networkObject.GetNameForMetrics(), networkObject.NetworkObjectId);
296+
}
314297
}
315298

316299
internal class NetcodeObserver

0 commit comments

Comments
 (0)