Skip to content

Commit 9570c47

Browse files
authored
fix: Implement a max number of metric values dispatched per frame (#1287)
* Implement a max number of metric values dispatched per frame
1 parent 42e44b4 commit 9570c47

File tree

2 files changed

+155
-144
lines changed

2 files changed

+155
-144
lines changed

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

Lines changed: 132 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
using Unity.Multiplayer.Tools;
55
using Unity.Multiplayer.Tools.MetricTypes;
66
using Unity.Multiplayer.Tools.NetStats;
7+
using UnityEngine;
78

89
namespace Unity.Netcode
910
{
1011
internal class NetworkMetrics : INetworkMetrics
1112
{
12-
private static Dictionary<uint, string> s_SceneEventTypeNames;
13+
const ulong k_MaxMetricsPerFrame = 1000L;
14+
15+
static Dictionary<uint, string> s_SceneEventTypeNames;
1316

1417
static NetworkMetrics()
1518
{
@@ -59,7 +62,8 @@ private static string GetSceneEventTypeName(uint typeCode)
5962
private readonly EventMetric<ServerLogEvent> m_ServerLogReceivedEvent = new EventMetric<ServerLogEvent>(NetworkMetricTypes.ServerLogReceived.Id);
6063
private readonly EventMetric<SceneEventMetric> m_SceneEventSentEvent = new EventMetric<SceneEventMetric>(NetworkMetricTypes.SceneEventSent.Id);
6164
private readonly EventMetric<SceneEventMetric> m_SceneEventReceivedEvent = new EventMetric<SceneEventMetric>(NetworkMetricTypes.SceneEventReceived.Id);
62-
private bool m_Dirty;
65+
66+
private ulong m_NumberOfMetricsThisFrame;
6367

6468
public NetworkMetrics()
6569
{
@@ -82,6 +86,8 @@ public NetworkMetrics()
8286

8387
internal IMetricDispatcher Dispatcher { get; }
8488

89+
private bool CanSendMetrics => m_NumberOfMetricsThisFrame < k_MaxMetricsPerFrame;
90+
8591
public void SetConnectionId(ulong connectionId)
8692
{
8793
Dispatcher.SetConnectionId(connectionId);
@@ -99,20 +105,35 @@ public void TrackTransportBytesReceived(long bytesCount)
99105

100106
public void TrackNetworkMessageSent(ulong receivedClientId, string messageType, long bytesCount)
101107
{
108+
if (!CanSendMetrics)
109+
{
110+
return;
111+
}
112+
102113
m_NetworkMessageSentEvent.Mark(new NetworkMessageEvent(new ConnectionInfo(receivedClientId), messageType, bytesCount));
103-
MarkDirty();
114+
IncrementMetricCount();
104115
}
105116

106117
public void TrackNetworkMessageReceived(ulong senderClientId, string messageType, long bytesCount)
107118
{
119+
if (!CanSendMetrics)
120+
{
121+
return;
122+
}
123+
108124
m_NetworkMessageReceivedEvent.Mark(new NetworkMessageEvent(new ConnectionInfo(senderClientId), messageType, bytesCount));
109-
MarkDirty();
125+
IncrementMetricCount();
110126
}
111127

112128
public void TrackNamedMessageSent(ulong receiverClientId, string messageName, long bytesCount)
113129
{
130+
if (!CanSendMetrics)
131+
{
132+
return;
133+
}
134+
114135
m_NamedMessageSentEvent.Mark(new NamedMessageEvent(new ConnectionInfo(receiverClientId), messageName, bytesCount));
115-
MarkDirty();
136+
IncrementMetricCount();
116137
}
117138

118139
public void TrackNamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, string messageName, long bytesCount)
@@ -125,14 +146,24 @@ public void TrackNamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds,
125146

126147
public void TrackNamedMessageReceived(ulong senderClientId, string messageName, long bytesCount)
127148
{
149+
if (!CanSendMetrics)
150+
{
151+
return;
152+
}
153+
128154
m_NamedMessageReceivedEvent.Mark(new NamedMessageEvent(new ConnectionInfo(senderClientId), messageName, bytesCount));
129-
MarkDirty();
155+
IncrementMetricCount();
130156
}
131157

132158
public void TrackUnnamedMessageSent(ulong receiverClientId, long bytesCount)
133159
{
160+
if (!CanSendMetrics)
161+
{
162+
return;
163+
}
164+
134165
m_UnnamedMessageSentEvent.Mark(new UnnamedMessageEvent(new ConnectionInfo(receiverClientId), bytesCount));
135-
MarkDirty();
166+
IncrementMetricCount();
136167
}
137168

138169
public void TrackUnnamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, long bytesCount)
@@ -145,8 +176,13 @@ public void TrackUnnamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds
145176

146177
public void TrackUnnamedMessageReceived(ulong senderClientId, long bytesCount)
147178
{
179+
if (!CanSendMetrics)
180+
{
181+
return;
182+
}
183+
148184
m_UnnamedMessageReceivedEvent.Mark(new UnnamedMessageEvent(new ConnectionInfo(senderClientId), bytesCount));
149-
MarkDirty();
185+
IncrementMetricCount();
150186
}
151187

152188
public void TrackNetworkVariableDeltaSent(
@@ -156,14 +192,19 @@ public void TrackNetworkVariableDeltaSent(
156192
string networkBehaviourName,
157193
long bytesCount)
158194
{
195+
if (!CanSendMetrics)
196+
{
197+
return;
198+
}
199+
159200
m_NetworkVariableDeltaSentEvent.Mark(
160201
new NetworkVariableEvent(
161202
new ConnectionInfo(receiverClientId),
162203
GetObjectIdentifier(networkObject),
163204
variableName,
164205
networkBehaviourName,
165206
bytesCount));
166-
MarkDirty();
207+
IncrementMetricCount();
167208
}
168209

169210
public void TrackNetworkVariableDeltaReceived(
@@ -173,51 +214,86 @@ public void TrackNetworkVariableDeltaReceived(
173214
string networkBehaviourName,
174215
long bytesCount)
175216
{
217+
if (!CanSendMetrics)
218+
{
219+
return;
220+
}
221+
176222
m_NetworkVariableDeltaReceivedEvent.Mark(
177223
new NetworkVariableEvent(
178224
new ConnectionInfo(senderClientId),
179225
GetObjectIdentifier(networkObject),
180226
variableName,
181227
networkBehaviourName,
182228
bytesCount));
183-
MarkDirty();
229+
IncrementMetricCount();
184230
}
185231

186232
public void TrackOwnershipChangeSent(ulong receiverClientId, NetworkObject networkObject, long bytesCount)
187233
{
234+
if (!CanSendMetrics)
235+
{
236+
return;
237+
}
238+
188239
m_OwnershipChangeSentEvent.Mark(new OwnershipChangeEvent(new ConnectionInfo(receiverClientId), GetObjectIdentifier(networkObject), bytesCount));
189-
MarkDirty();
240+
IncrementMetricCount();
190241
}
191242

192243
public void TrackOwnershipChangeReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount)
193244
{
245+
if (!CanSendMetrics)
246+
{
247+
return;
248+
}
249+
194250
m_OwnershipChangeReceivedEvent.Mark(new OwnershipChangeEvent(new ConnectionInfo(senderClientId),
195251
GetObjectIdentifier(networkObject), bytesCount));
196-
MarkDirty();
252+
IncrementMetricCount();
197253
}
198254

199255
public void TrackObjectSpawnSent(ulong receiverClientId, NetworkObject networkObject, long bytesCount)
200256
{
257+
if (!CanSendMetrics)
258+
{
259+
return;
260+
}
261+
201262
m_ObjectSpawnSentEvent.Mark(new ObjectSpawnedEvent(new ConnectionInfo(receiverClientId), GetObjectIdentifier(networkObject), bytesCount));
202-
MarkDirty();
263+
IncrementMetricCount();
203264
}
204265

205266
public void TrackObjectSpawnReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount)
206267
{
268+
if (!CanSendMetrics)
269+
{
270+
return;
271+
}
272+
207273
m_ObjectSpawnReceivedEvent.Mark(new ObjectSpawnedEvent(new ConnectionInfo(senderClientId), GetObjectIdentifier(networkObject), bytesCount));
208-
MarkDirty();
274+
IncrementMetricCount();
209275
}
210276

211277
public void TrackObjectDestroySent(ulong receiverClientId, NetworkObject networkObject, long bytesCount)
212278
{
279+
if (!CanSendMetrics)
280+
{
281+
return;
282+
}
283+
213284
m_ObjectDestroySentEvent.Mark(new ObjectDestroyedEvent(new ConnectionInfo(receiverClientId), GetObjectIdentifier(networkObject), bytesCount));
214-
MarkDirty();
285+
IncrementMetricCount();
215286
}
216287

217288
public void TrackObjectDestroyReceived(ulong senderClientId, NetworkObject networkObject, long bytesCount)
218289
{
290+
if (!CanSendMetrics)
291+
{
292+
return;
293+
}
294+
219295
m_ObjectDestroyReceivedEvent.Mark(new ObjectDestroyedEvent(new ConnectionInfo(senderClientId), GetObjectIdentifier(networkObject), bytesCount));
220-
MarkDirty();
296+
IncrementMetricCount();
221297
}
222298

223299
public void TrackRpcSent(
@@ -227,14 +303,19 @@ public void TrackRpcSent(
227303
string networkBehaviourName,
228304
long bytesCount)
229305
{
306+
if (!CanSendMetrics)
307+
{
308+
return;
309+
}
310+
230311
m_RpcSentEvent.Mark(
231312
new RpcEvent(
232313
new ConnectionInfo(receiverClientId),
233314
GetObjectIdentifier(networkObject),
234315
rpcName,
235316
networkBehaviourName,
236317
bytesCount));
237-
MarkDirty();
318+
IncrementMetricCount();
238319
}
239320

240321
public void TrackRpcSent(
@@ -257,25 +338,40 @@ public void TrackRpcReceived(
257338
string networkBehaviourName,
258339
long bytesCount)
259340
{
341+
if (!CanSendMetrics)
342+
{
343+
return;
344+
}
345+
260346
m_RpcReceivedEvent.Mark(
261347
new RpcEvent(new ConnectionInfo(senderClientId),
262348
GetObjectIdentifier(networkObject),
263349
rpcName,
264350
networkBehaviourName,
265351
bytesCount));
266-
MarkDirty();
352+
IncrementMetricCount();
267353
}
268354

269355
public void TrackServerLogSent(ulong receiverClientId, uint logType, long bytesCount)
270356
{
357+
if (!CanSendMetrics)
358+
{
359+
return;
360+
}
361+
271362
m_ServerLogSentEvent.Mark(new ServerLogEvent(new ConnectionInfo(receiverClientId), (Multiplayer.Tools.MetricTypes.LogLevel)logType, bytesCount));
272-
MarkDirty();
363+
IncrementMetricCount();
273364
}
274365

275366
public void TrackServerLogReceived(ulong senderClientId, uint logType, long bytesCount)
276367
{
368+
if (!CanSendMetrics)
369+
{
370+
return;
371+
}
372+
277373
m_ServerLogReceivedEvent.Mark(new ServerLogEvent(new ConnectionInfo(senderClientId), (Multiplayer.Tools.MetricTypes.LogLevel)logType, bytesCount));
278-
MarkDirty();
374+
IncrementMetricCount();
279375
}
280376

281377
public void TrackSceneEventSent(IReadOnlyList<ulong> receiverClientIds, uint sceneEventType, string sceneName, long bytesCount)
@@ -288,28 +384,35 @@ public void TrackSceneEventSent(IReadOnlyList<ulong> receiverClientIds, uint sce
288384

289385
public void TrackSceneEventSent(ulong receiverClientId, uint sceneEventType, string sceneName, long bytesCount)
290386
{
387+
if (!CanSendMetrics)
388+
{
389+
return;
390+
}
391+
291392
m_SceneEventSentEvent.Mark(new SceneEventMetric(new ConnectionInfo(receiverClientId), GetSceneEventTypeName(sceneEventType), sceneName, bytesCount));
292-
MarkDirty();
393+
IncrementMetricCount();
293394
}
294395

295396
public void TrackSceneEventReceived(ulong senderClientId, uint sceneEventType, string sceneName, long bytesCount)
296397
{
398+
if (!CanSendMetrics)
399+
{
400+
return;
401+
}
402+
297403
m_SceneEventReceivedEvent.Mark(new SceneEventMetric(new ConnectionInfo(senderClientId), GetSceneEventTypeName(sceneEventType), sceneName, bytesCount));
298-
MarkDirty();
404+
IncrementMetricCount();
299405
}
300406

301407
public void DispatchFrame()
302408
{
303-
if (m_Dirty)
304-
{
305-
Dispatcher.Dispatch();
306-
m_Dirty = false;
307-
}
409+
Dispatcher.Dispatch();
410+
m_NumberOfMetricsThisFrame = 0;
308411
}
309412

310-
private void MarkDirty()
413+
private void IncrementMetricCount()
311414
{
312-
m_Dirty = true;
415+
m_NumberOfMetricsThisFrame++;
313416
}
314417

315418
private static NetworkObjectIdentifier GetObjectIdentifier(NetworkObject networkObject)

0 commit comments

Comments
 (0)