44using Unity . Multiplayer . Tools ;
55using Unity . Multiplayer . Tools . MetricTypes ;
66using Unity . Multiplayer . Tools . NetStats ;
7+ using UnityEngine ;
78
89namespace 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