@@ -73,7 +73,9 @@ private void OnValidate()
7373 private ConnectionConfig Init ( NetworkingConfiguration netConfig )
7474 {
7575 NetworkConfig = netConfig ;
76-
76+ lastSendTickTime = 0 ;
77+ lastEventTickTime = 0 ;
78+ lastReceiveTickTime = 0 ;
7779 pendingClients = new HashSet < int > ( ) ;
7880 connectedClients = new Dictionary < int , NetworkedClient > ( ) ;
7981 messageBuffer = new byte [ NetworkConfig . MessageBufferSize ] ;
@@ -109,7 +111,7 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
109111 } ;
110112
111113 //MLAPI channels and messageTypes
112- NetworkConfig . Channels . Add ( "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED " , QosType . ReliableFragmentedSequenced ) ;
114+ NetworkConfig . Channels . Add ( "MLAPI_INTERNAL " , QosType . ReliableFragmentedSequenced ) ;
113115 NetworkConfig . Channels . Add ( "MLAPI_POSITION_UPDATE" , QosType . StateUpdate ) ;
114116 NetworkConfig . Channels . Add ( "MLAPI_ANIMATION_UPDATE" , QosType . ReliableSequenced ) ;
115117 MessageManager . messageTypes . Add ( "MLAPI_CONNECTION_REQUEST" , 0 ) ;
@@ -295,75 +297,92 @@ private void Shutdown()
295297 private int channelId ;
296298 private int receivedSize ;
297299 private byte error ;
298- private float lastTickTime ;
300+ private float lastReceiveTickTime ;
301+ private float lastSendTickTime ;
302+ private float lastEventTickTime ;
299303 private void Update ( )
300304 {
301- if ( isListening && ( Time . time - lastTickTime >= ( 1f / NetworkConfig . Tickrate ) ) )
305+ if ( isListening )
302306 {
303- foreach ( KeyValuePair < int , NetworkedClient > pair in connectedClients )
304- {
305- NetworkTransport . SendQueuedMessages ( hostId , pair . Key , out error ) ;
306- }
307- NetworkEventType eventType = NetworkTransport . Receive ( out hostId , out clientId , out channelId , messageBuffer , messageBuffer . Length , out receivedSize , out error ) ;
308- NetworkError networkError = ( NetworkError ) error ;
309- if ( networkError == NetworkError . Timeout )
307+ if ( ( Time . time - lastSendTickTime >= ( 1f / NetworkConfig . SendTickrate ) ) || NetworkConfig . SendTickrate <= 0 )
310308 {
311- //Client timed out.
312- if ( isServer )
309+ foreach ( KeyValuePair < int , NetworkedClient > pair in connectedClients )
313310 {
314- OnClientDisconnect ( clientId ) ;
315- return ;
311+ NetworkTransport . SendQueuedMessages ( hostId , pair . Key , out error ) ;
316312 }
313+ lastSendTickTime = Time . time ;
317314 }
318- else if ( networkError != NetworkError . Ok )
319- {
320- Debug . LogWarning ( "MLAPI: NetworkTransport receive error: " + networkError . ToString ( ) ) ;
321- return ;
322- }
323-
324- switch ( eventType )
315+ if ( ( Time . time - lastReceiveTickTime >= ( 1f / NetworkConfig . ReceiveTickrate ) ) || NetworkConfig . ReceiveTickrate <= 0 )
325316 {
326- case NetworkEventType . ConnectEvent :
327- if ( isServer )
317+ NetworkEventType eventType ;
318+ int processedEvents = 0 ;
319+ do
320+ {
321+ processedEvents ++ ;
322+ eventType = NetworkTransport . Receive ( out hostId , out clientId , out channelId , messageBuffer , messageBuffer . Length , out receivedSize , out error ) ;
323+ NetworkError networkError = ( NetworkError ) error ;
324+ if ( networkError == NetworkError . Timeout )
328325 {
329- pendingClients . Add ( clientId ) ;
330- StartCoroutine ( ApprovalTimeout ( clientId ) ) ;
326+ //Client timed out.
327+ if ( isServer )
328+ {
329+ OnClientDisconnect ( clientId ) ;
330+ return ;
331+ }
331332 }
332- else
333+ else if ( networkError != NetworkError . Ok )
333334 {
334- int sizeOfStream = 32 ;
335- if ( NetworkConfig . ConnectionApproval )
336- sizeOfStream += 2 + NetworkConfig . ConnectionData . Length ;
335+ Debug . LogWarning ( "MLAPI: NetworkTransport receive error: " + networkError . ToString ( ) ) ;
336+ return ;
337+ }
337338
338- using ( MemoryStream writeStream = new MemoryStream ( sizeOfStream ) )
339- {
340- using ( BinaryWriter writer = new BinaryWriter ( writeStream ) )
339+ switch ( eventType )
340+ {
341+ case NetworkEventType . ConnectEvent :
342+ if ( isServer )
343+ {
344+ pendingClients . Add ( clientId ) ;
345+ StartCoroutine ( ApprovalTimeout ( clientId ) ) ;
346+ }
347+ else
341348 {
342- writer . Write ( NetworkConfig . GetConfig ( ) ) ;
349+ int sizeOfStream = 32 ;
343350 if ( NetworkConfig . ConnectionApproval )
351+ sizeOfStream += 2 + NetworkConfig . ConnectionData . Length ;
352+
353+ using ( MemoryStream writeStream = new MemoryStream ( sizeOfStream ) )
344354 {
345- writer . Write ( ( ushort ) NetworkConfig . ConnectionData . Length ) ;
346- writer . Write ( NetworkConfig . ConnectionData ) ;
355+ using ( BinaryWriter writer = new BinaryWriter ( writeStream ) )
356+ {
357+ writer . Write ( NetworkConfig . GetConfig ( ) ) ;
358+ if ( NetworkConfig . ConnectionApproval )
359+ {
360+ writer . Write ( ( ushort ) NetworkConfig . ConnectionData . Length ) ;
361+ writer . Write ( NetworkConfig . ConnectionData ) ;
362+ }
363+ }
364+ Send ( clientId , "MLAPI_CONNECTION_REQUEST" , "MLAPI_INTERNAL" , writeStream . GetBuffer ( ) ) ;
347365 }
348366 }
349- Send ( clientId , "MLAPI_CONNECTION_REQUEST" , "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED" , writeStream . GetBuffer ( ) ) ;
350- }
367+ break ;
368+ case NetworkEventType . DataEvent :
369+ HandleIncomingData ( clientId , messageBuffer , channelId ) ;
370+ break ;
371+ case NetworkEventType . DisconnectEvent :
372+ if ( isServer )
373+ OnClientDisconnect ( clientId ) ;
374+ break ;
351375 }
352- break ;
353- case NetworkEventType . DataEvent :
354- HandleIncomingData ( clientId , messageBuffer , channelId ) ;
355- break ;
356- case NetworkEventType . DisconnectEvent :
357- if ( isServer )
358- OnClientDisconnect ( clientId ) ;
359- break ;
376+ // Only do another iteration if: there are no more messages AND (there is no limit to max events or we have processed less than the maximum)
377+ } while ( eventType != NetworkEventType . Nothing && ( NetworkConfig . MaxReceiveEventsPerTickRate <= 0 || processedEvents < NetworkConfig . MaxReceiveEventsPerTickRate ) ) ;
378+ lastReceiveTickTime = Time . time ;
360379 }
361- if ( isServer )
380+ if ( isServer && ( ( Time . time - lastEventTickTime >= ( 1f / NetworkConfig . EventTickrate ) ) || NetworkConfig . EventTickrate <= 0 ) )
362381 {
363382 LagCompensationManager . AddFrames ( ) ;
364383 NetworkedObject . InvokeSyncvarUpdate ( ) ;
384+ lastEventTickTime = Time . time ;
365385 }
366- lastTickTime = Time . time ;
367386 }
368387 }
369388
@@ -1074,7 +1093,7 @@ private void OnClientDisconnect(int clientId)
10741093 {
10751094 writer . Write ( clientId ) ;
10761095 }
1077- Send ( "MLAPI_CLIENT_DISCONNECT" , "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED " , stream . GetBuffer ( ) , clientId ) ;
1096+ Send ( "MLAPI_CLIENT_DISCONNECT" , "MLAPI_INTERNAL " , stream . GetBuffer ( ) , clientId ) ;
10781097 }
10791098 }
10801099 }
@@ -1153,7 +1172,7 @@ private void HandleApproval(int clientId, bool approved)
11531172 }
11541173 }
11551174 }
1156- Send ( clientId , "MLAPI_CONNECTION_APPROVED" , "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED " , writeStream . GetBuffer ( ) ) ;
1175+ Send ( clientId , "MLAPI_CONNECTION_APPROVED" , "MLAPI_INTERNAL " , writeStream . GetBuffer ( ) ) ;
11571176 }
11581177
11591178 //Inform old clients of the new player
@@ -1179,7 +1198,7 @@ private void HandleApproval(int clientId, bool approved)
11791198 writer . Write ( clientId ) ;
11801199 }
11811200 }
1182- Send ( "MLAPI_ADD_OBJECT" , "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED " , stream . GetBuffer ( ) , clientId ) ;
1201+ Send ( "MLAPI_ADD_OBJECT" , "MLAPI_INTERNAL " , stream . GetBuffer ( ) , clientId ) ;
11831202 }
11841203 //Flush syncvars:
11851204 foreach ( KeyValuePair < uint , NetworkedObject > networkedObject in SpawnManager . spawnedObjects )
0 commit comments