11using System ;
2+ using System . Collections . Generic ;
23using Unity . Profiling ;
34using UnityEngine ;
45
@@ -29,6 +30,7 @@ internal class MessageQueueProcessor
2930 private MessageQueueContainer m_MessageQueueContainer ;
3031
3132 private readonly NetworkManager m_NetworkManager ;
33+ private readonly List < ulong > m_TargetIdBuffer = new List < ulong > ( ) ;
3234
3335 public void Shutdown ( )
3436 {
@@ -217,6 +219,28 @@ internal void ProcessSendQueue(bool isListening)
217219#endif
218220 }
219221
222+ /// <summary>
223+ /// FillTargetList
224+ /// Fills a list with the ClientId's an item is targeted to
225+ /// </summary>
226+ /// <param name="item">the MessageQueueItem we want targets for</param>
227+ /// <param name="targetList">the list to fill</param>
228+ private static void FillTargetList ( in MessageFrameItem item , List < ulong > targetList )
229+ {
230+ switch ( item . MessageType )
231+ {
232+ case MessageQueueContainer . MessageType . ServerRpc :
233+ targetList . Add ( item . NetworkId ) ;
234+ break ;
235+ default :
236+ // todo: consider the implications of default usage of queueItem.clientIds
237+ case MessageQueueContainer . MessageType . ClientRpc :
238+ // copy the list
239+ targetList . AddRange ( item . ClientNetworkIds ) ;
240+ break ;
241+ }
242+ }
243+
220244 /// <summary>
221245 /// Sends all message queue items in the current outbound frame
222246 /// </summary>
@@ -235,13 +259,21 @@ private void MessageQueueSendAndFlush(bool isListening)
235259 advanceFrameHistory = true ;
236260 if ( isListening )
237261 {
262+ m_TargetIdBuffer . Clear ( ) ;
263+ FillTargetList ( currentQueueItem , m_TargetIdBuffer ) ;
264+
238265 if ( m_MessageQueueContainer . IsUsingBatching ( ) )
239266 {
240- m_MessageBatcher . QueueItem ( currentQueueItem , k_BatchThreshold , SendCallback ) ;
267+ m_MessageBatcher . QueueItem ( m_TargetIdBuffer , currentQueueItem , k_BatchThreshold , SendCallback ) ;
241268 }
242269 else
243270 {
244- SendFrameQueueItem ( currentQueueItem ) ;
271+ SendFrameQueueItem ( m_TargetIdBuffer , currentQueueItem ) ;
272+ }
273+
274+ foreach ( var target in m_TargetIdBuffer )
275+ {
276+ m_NetworkManager . NetworkMetrics . TrackNetworkMessageSent ( target , MessageQueueContainer . GetMessageTypeName ( currentQueueItem . MessageType ) , currentQueueItem . MessageData . Count ) ;
245277 }
246278 }
247279
@@ -293,7 +325,7 @@ private void SendCallback(ulong clientId, MessageBatcher.SendStream sendStream)
293325 /// Sends the Message Queue Item to the specified destination
294326 /// </summary>
295327 /// <param name="item">Information on what to send</param>
296- private void SendFrameQueueItem ( MessageFrameItem item )
328+ private void SendFrameQueueItem ( IReadOnlyCollection < ulong > targetIds , in MessageFrameItem item )
297329 {
298330 var channel = item . NetworkChannel ;
299331 // If the length is greater than the fragmented threshold, switch to a fragmented channel.
@@ -304,25 +336,11 @@ private void SendFrameQueueItem(MessageFrameItem item)
304336 {
305337 channel = NetworkChannel . Fragmented ;
306338 }
307- switch ( item . MessageType )
308- {
309- case MessageQueueContainer . MessageType . ServerRpc :
310- // TODO: Can we remove this special case for server RPCs?
311- {
312- m_MessageQueueContainer . NetworkManager . NetworkMetrics . TrackTransportBytesSent ( item . MessageData . Count ) ;
313- m_MessageQueueContainer . NetworkManager . NetworkConfig . NetworkTransport . Send ( item . NetworkId , item . MessageData , channel ) ;
314- break ;
315- }
316- default :
317- {
318- foreach ( ulong clientid in item . ClientNetworkIds )
319- {
320- m_MessageQueueContainer . NetworkManager . NetworkMetrics . TrackTransportBytesSent ( item . MessageData . Count ) ;
321- m_MessageQueueContainer . NetworkManager . NetworkConfig . NetworkTransport . Send ( clientid , item . MessageData , channel ) ;
322- }
323339
324- break ;
325- }
340+ foreach ( var clientId in targetIds )
341+ {
342+ m_MessageQueueContainer . NetworkManager . NetworkMetrics . TrackTransportBytesSent ( item . MessageData . Count ) ;
343+ m_MessageQueueContainer . NetworkManager . NetworkConfig . NetworkTransport . Send ( clientId , item . MessageData , channel ) ;
326344 }
327345 }
328346
0 commit comments