4
4
using Unity . Multiplayer . Tools ;
5
5
using Unity . Multiplayer . Tools . MetricTypes ;
6
6
using Unity . Multiplayer . Tools . NetStats ;
7
+ using UnityEngine ;
7
8
8
9
namespace Unity . Netcode
9
10
{
10
11
internal class NetworkMetrics : INetworkMetrics
11
12
{
12
- private static Dictionary < uint , string > s_SceneEventTypeNames ;
13
+ const ulong k_MaxMetricsPerFrame = 1000L ;
14
+
15
+ static Dictionary < uint , string > s_SceneEventTypeNames ;
13
16
14
17
static NetworkMetrics ( )
15
18
{
@@ -59,7 +62,8 @@ private static string GetSceneEventTypeName(uint typeCode)
59
62
private readonly EventMetric < ServerLogEvent > m_ServerLogReceivedEvent = new EventMetric < ServerLogEvent > ( NetworkMetricTypes . ServerLogReceived . Id ) ;
60
63
private readonly EventMetric < SceneEventMetric > m_SceneEventSentEvent = new EventMetric < SceneEventMetric > ( NetworkMetricTypes . SceneEventSent . Id ) ;
61
64
private readonly EventMetric < SceneEventMetric > m_SceneEventReceivedEvent = new EventMetric < SceneEventMetric > ( NetworkMetricTypes . SceneEventReceived . Id ) ;
62
- private bool m_Dirty ;
65
+
66
+ private ulong m_NumberOfMetricsThisFrame ;
63
67
64
68
public NetworkMetrics ( )
65
69
{
@@ -82,6 +86,8 @@ public NetworkMetrics()
82
86
83
87
internal IMetricDispatcher Dispatcher { get ; }
84
88
89
+ private bool CanSendMetrics => m_NumberOfMetricsThisFrame < k_MaxMetricsPerFrame ;
90
+
85
91
public void SetConnectionId ( ulong connectionId )
86
92
{
87
93
Dispatcher . SetConnectionId ( connectionId ) ;
@@ -99,20 +105,35 @@ public void TrackTransportBytesReceived(long bytesCount)
99
105
100
106
public void TrackNetworkMessageSent ( ulong receivedClientId , string messageType , long bytesCount )
101
107
{
108
+ if ( ! CanSendMetrics )
109
+ {
110
+ return ;
111
+ }
112
+
102
113
m_NetworkMessageSentEvent . Mark ( new NetworkMessageEvent ( new ConnectionInfo ( receivedClientId ) , messageType , bytesCount ) ) ;
103
- MarkDirty ( ) ;
114
+ IncrementMetricCount ( ) ;
104
115
}
105
116
106
117
public void TrackNetworkMessageReceived ( ulong senderClientId , string messageType , long bytesCount )
107
118
{
119
+ if ( ! CanSendMetrics )
120
+ {
121
+ return ;
122
+ }
123
+
108
124
m_NetworkMessageReceivedEvent . Mark ( new NetworkMessageEvent ( new ConnectionInfo ( senderClientId ) , messageType , bytesCount ) ) ;
109
- MarkDirty ( ) ;
125
+ IncrementMetricCount ( ) ;
110
126
}
111
127
112
128
public void TrackNamedMessageSent ( ulong receiverClientId , string messageName , long bytesCount )
113
129
{
130
+ if ( ! CanSendMetrics )
131
+ {
132
+ return ;
133
+ }
134
+
114
135
m_NamedMessageSentEvent . Mark ( new NamedMessageEvent ( new ConnectionInfo ( receiverClientId ) , messageName , bytesCount ) ) ;
115
- MarkDirty ( ) ;
136
+ IncrementMetricCount ( ) ;
116
137
}
117
138
118
139
public void TrackNamedMessageSent ( IReadOnlyCollection < ulong > receiverClientIds , string messageName , long bytesCount )
@@ -125,14 +146,24 @@ public void TrackNamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds,
125
146
126
147
public void TrackNamedMessageReceived ( ulong senderClientId , string messageName , long bytesCount )
127
148
{
149
+ if ( ! CanSendMetrics )
150
+ {
151
+ return ;
152
+ }
153
+
128
154
m_NamedMessageReceivedEvent . Mark ( new NamedMessageEvent ( new ConnectionInfo ( senderClientId ) , messageName , bytesCount ) ) ;
129
- MarkDirty ( ) ;
155
+ IncrementMetricCount ( ) ;
130
156
}
131
157
132
158
public void TrackUnnamedMessageSent ( ulong receiverClientId , long bytesCount )
133
159
{
160
+ if ( ! CanSendMetrics )
161
+ {
162
+ return ;
163
+ }
164
+
134
165
m_UnnamedMessageSentEvent . Mark ( new UnnamedMessageEvent ( new ConnectionInfo ( receiverClientId ) , bytesCount ) ) ;
135
- MarkDirty ( ) ;
166
+ IncrementMetricCount ( ) ;
136
167
}
137
168
138
169
public void TrackUnnamedMessageSent ( IReadOnlyCollection < ulong > receiverClientIds , long bytesCount )
@@ -145,8 +176,13 @@ public void TrackUnnamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds
145
176
146
177
public void TrackUnnamedMessageReceived ( ulong senderClientId , long bytesCount )
147
178
{
179
+ if ( ! CanSendMetrics )
180
+ {
181
+ return ;
182
+ }
183
+
148
184
m_UnnamedMessageReceivedEvent . Mark ( new UnnamedMessageEvent ( new ConnectionInfo ( senderClientId ) , bytesCount ) ) ;
149
- MarkDirty ( ) ;
185
+ IncrementMetricCount ( ) ;
150
186
}
151
187
152
188
public void TrackNetworkVariableDeltaSent (
@@ -156,14 +192,19 @@ public void TrackNetworkVariableDeltaSent(
156
192
string networkBehaviourName ,
157
193
long bytesCount )
158
194
{
195
+ if ( ! CanSendMetrics )
196
+ {
197
+ return ;
198
+ }
199
+
159
200
m_NetworkVariableDeltaSentEvent . Mark (
160
201
new NetworkVariableEvent (
161
202
new ConnectionInfo ( receiverClientId ) ,
162
203
GetObjectIdentifier ( networkObject ) ,
163
204
variableName ,
164
205
networkBehaviourName ,
165
206
bytesCount ) ) ;
166
- MarkDirty ( ) ;
207
+ IncrementMetricCount ( ) ;
167
208
}
168
209
169
210
public void TrackNetworkVariableDeltaReceived (
@@ -173,51 +214,86 @@ public void TrackNetworkVariableDeltaReceived(
173
214
string networkBehaviourName ,
174
215
long bytesCount )
175
216
{
217
+ if ( ! CanSendMetrics )
218
+ {
219
+ return ;
220
+ }
221
+
176
222
m_NetworkVariableDeltaReceivedEvent . Mark (
177
223
new NetworkVariableEvent (
178
224
new ConnectionInfo ( senderClientId ) ,
179
225
GetObjectIdentifier ( networkObject ) ,
180
226
variableName ,
181
227
networkBehaviourName ,
182
228
bytesCount ) ) ;
183
- MarkDirty ( ) ;
229
+ IncrementMetricCount ( ) ;
184
230
}
185
231
186
232
public void TrackOwnershipChangeSent ( ulong receiverClientId , NetworkObject networkObject , long bytesCount )
187
233
{
234
+ if ( ! CanSendMetrics )
235
+ {
236
+ return ;
237
+ }
238
+
188
239
m_OwnershipChangeSentEvent . Mark ( new OwnershipChangeEvent ( new ConnectionInfo ( receiverClientId ) , GetObjectIdentifier ( networkObject ) , bytesCount ) ) ;
189
- MarkDirty ( ) ;
240
+ IncrementMetricCount ( ) ;
190
241
}
191
242
192
243
public void TrackOwnershipChangeReceived ( ulong senderClientId , NetworkObject networkObject , long bytesCount )
193
244
{
245
+ if ( ! CanSendMetrics )
246
+ {
247
+ return ;
248
+ }
249
+
194
250
m_OwnershipChangeReceivedEvent . Mark ( new OwnershipChangeEvent ( new ConnectionInfo ( senderClientId ) ,
195
251
GetObjectIdentifier ( networkObject ) , bytesCount ) ) ;
196
- MarkDirty ( ) ;
252
+ IncrementMetricCount ( ) ;
197
253
}
198
254
199
255
public void TrackObjectSpawnSent ( ulong receiverClientId , NetworkObject networkObject , long bytesCount )
200
256
{
257
+ if ( ! CanSendMetrics )
258
+ {
259
+ return ;
260
+ }
261
+
201
262
m_ObjectSpawnSentEvent . Mark ( new ObjectSpawnedEvent ( new ConnectionInfo ( receiverClientId ) , GetObjectIdentifier ( networkObject ) , bytesCount ) ) ;
202
- MarkDirty ( ) ;
263
+ IncrementMetricCount ( ) ;
203
264
}
204
265
205
266
public void TrackObjectSpawnReceived ( ulong senderClientId , NetworkObject networkObject , long bytesCount )
206
267
{
268
+ if ( ! CanSendMetrics )
269
+ {
270
+ return ;
271
+ }
272
+
207
273
m_ObjectSpawnReceivedEvent . Mark ( new ObjectSpawnedEvent ( new ConnectionInfo ( senderClientId ) , GetObjectIdentifier ( networkObject ) , bytesCount ) ) ;
208
- MarkDirty ( ) ;
274
+ IncrementMetricCount ( ) ;
209
275
}
210
276
211
277
public void TrackObjectDestroySent ( ulong receiverClientId , NetworkObject networkObject , long bytesCount )
212
278
{
279
+ if ( ! CanSendMetrics )
280
+ {
281
+ return ;
282
+ }
283
+
213
284
m_ObjectDestroySentEvent . Mark ( new ObjectDestroyedEvent ( new ConnectionInfo ( receiverClientId ) , GetObjectIdentifier ( networkObject ) , bytesCount ) ) ;
214
- MarkDirty ( ) ;
285
+ IncrementMetricCount ( ) ;
215
286
}
216
287
217
288
public void TrackObjectDestroyReceived ( ulong senderClientId , NetworkObject networkObject , long bytesCount )
218
289
{
290
+ if ( ! CanSendMetrics )
291
+ {
292
+ return ;
293
+ }
294
+
219
295
m_ObjectDestroyReceivedEvent . Mark ( new ObjectDestroyedEvent ( new ConnectionInfo ( senderClientId ) , GetObjectIdentifier ( networkObject ) , bytesCount ) ) ;
220
- MarkDirty ( ) ;
296
+ IncrementMetricCount ( ) ;
221
297
}
222
298
223
299
public void TrackRpcSent (
@@ -227,14 +303,19 @@ public void TrackRpcSent(
227
303
string networkBehaviourName ,
228
304
long bytesCount )
229
305
{
306
+ if ( ! CanSendMetrics )
307
+ {
308
+ return ;
309
+ }
310
+
230
311
m_RpcSentEvent . Mark (
231
312
new RpcEvent (
232
313
new ConnectionInfo ( receiverClientId ) ,
233
314
GetObjectIdentifier ( networkObject ) ,
234
315
rpcName ,
235
316
networkBehaviourName ,
236
317
bytesCount ) ) ;
237
- MarkDirty ( ) ;
318
+ IncrementMetricCount ( ) ;
238
319
}
239
320
240
321
public void TrackRpcSent (
@@ -257,25 +338,40 @@ public void TrackRpcReceived(
257
338
string networkBehaviourName ,
258
339
long bytesCount )
259
340
{
341
+ if ( ! CanSendMetrics )
342
+ {
343
+ return ;
344
+ }
345
+
260
346
m_RpcReceivedEvent . Mark (
261
347
new RpcEvent ( new ConnectionInfo ( senderClientId ) ,
262
348
GetObjectIdentifier ( networkObject ) ,
263
349
rpcName ,
264
350
networkBehaviourName ,
265
351
bytesCount ) ) ;
266
- MarkDirty ( ) ;
352
+ IncrementMetricCount ( ) ;
267
353
}
268
354
269
355
public void TrackServerLogSent ( ulong receiverClientId , uint logType , long bytesCount )
270
356
{
357
+ if ( ! CanSendMetrics )
358
+ {
359
+ return ;
360
+ }
361
+
271
362
m_ServerLogSentEvent . Mark ( new ServerLogEvent ( new ConnectionInfo ( receiverClientId ) , ( Multiplayer . Tools . MetricTypes . LogLevel ) logType , bytesCount ) ) ;
272
- MarkDirty ( ) ;
363
+ IncrementMetricCount ( ) ;
273
364
}
274
365
275
366
public void TrackServerLogReceived ( ulong senderClientId , uint logType , long bytesCount )
276
367
{
368
+ if ( ! CanSendMetrics )
369
+ {
370
+ return ;
371
+ }
372
+
277
373
m_ServerLogReceivedEvent . Mark ( new ServerLogEvent ( new ConnectionInfo ( senderClientId ) , ( Multiplayer . Tools . MetricTypes . LogLevel ) logType , bytesCount ) ) ;
278
- MarkDirty ( ) ;
374
+ IncrementMetricCount ( ) ;
279
375
}
280
376
281
377
public void TrackSceneEventSent ( IReadOnlyList < ulong > receiverClientIds , uint sceneEventType , string sceneName , long bytesCount )
@@ -288,28 +384,35 @@ public void TrackSceneEventSent(IReadOnlyList<ulong> receiverClientIds, uint sce
288
384
289
385
public void TrackSceneEventSent ( ulong receiverClientId , uint sceneEventType , string sceneName , long bytesCount )
290
386
{
387
+ if ( ! CanSendMetrics )
388
+ {
389
+ return ;
390
+ }
391
+
291
392
m_SceneEventSentEvent . Mark ( new SceneEventMetric ( new ConnectionInfo ( receiverClientId ) , GetSceneEventTypeName ( sceneEventType ) , sceneName , bytesCount ) ) ;
292
- MarkDirty ( ) ;
393
+ IncrementMetricCount ( ) ;
293
394
}
294
395
295
396
public void TrackSceneEventReceived ( ulong senderClientId , uint sceneEventType , string sceneName , long bytesCount )
296
397
{
398
+ if ( ! CanSendMetrics )
399
+ {
400
+ return ;
401
+ }
402
+
297
403
m_SceneEventReceivedEvent . Mark ( new SceneEventMetric ( new ConnectionInfo ( senderClientId ) , GetSceneEventTypeName ( sceneEventType ) , sceneName , bytesCount ) ) ;
298
- MarkDirty ( ) ;
404
+ IncrementMetricCount ( ) ;
299
405
}
300
406
301
407
public void DispatchFrame ( )
302
408
{
303
- if ( m_Dirty )
304
- {
305
- Dispatcher . Dispatch ( ) ;
306
- m_Dirty = false ;
307
- }
409
+ Dispatcher . Dispatch ( ) ;
410
+ m_NumberOfMetricsThisFrame = 0 ;
308
411
}
309
412
310
- private void MarkDirty ( )
413
+ private void IncrementMetricCount ( )
311
414
{
312
- m_Dirty = true ;
415
+ m_NumberOfMetricsThisFrame ++ ;
313
416
}
314
417
315
418
private static NetworkObjectIdentifier GetObjectIdentifier ( NetworkObject networkObject )
0 commit comments