@@ -73,7 +73,9 @@ private void OnValidate()
73
73
private ConnectionConfig Init ( NetworkingConfiguration netConfig )
74
74
{
75
75
NetworkConfig = netConfig ;
76
-
76
+ lastSendTickTime = 0 ;
77
+ lastEventTickTime = 0 ;
78
+ lastReceiveTickTime = 0 ;
77
79
pendingClients = new HashSet < int > ( ) ;
78
80
connectedClients = new Dictionary < int , NetworkedClient > ( ) ;
79
81
messageBuffer = new byte [ NetworkConfig . MessageBufferSize ] ;
@@ -109,7 +111,7 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
109
111
} ;
110
112
111
113
//MLAPI channels and messageTypes
112
- NetworkConfig . Channels . Add ( "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED " , QosType . ReliableFragmentedSequenced ) ;
114
+ NetworkConfig . Channels . Add ( "MLAPI_INTERNAL " , QosType . ReliableFragmentedSequenced ) ;
113
115
NetworkConfig . Channels . Add ( "MLAPI_POSITION_UPDATE" , QosType . StateUpdate ) ;
114
116
NetworkConfig . Channels . Add ( "MLAPI_ANIMATION_UPDATE" , QosType . ReliableSequenced ) ;
115
117
MessageManager . messageTypes . Add ( "MLAPI_CONNECTION_REQUEST" , 0 ) ;
@@ -295,75 +297,92 @@ private void Shutdown()
295
297
private int channelId ;
296
298
private int receivedSize ;
297
299
private byte error ;
298
- private float lastTickTime ;
300
+ private float lastReceiveTickTime ;
301
+ private float lastSendTickTime ;
302
+ private float lastEventTickTime ;
299
303
private void Update ( )
300
304
{
301
- if ( isListening && ( Time . time - lastTickTime >= ( 1f / NetworkConfig . Tickrate ) ) )
305
+ if ( isListening )
302
306
{
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 )
310
308
{
311
- //Client timed out.
312
- if ( isServer )
309
+ foreach ( KeyValuePair < int , NetworkedClient > pair in connectedClients )
313
310
{
314
- OnClientDisconnect ( clientId ) ;
315
- return ;
311
+ NetworkTransport . SendQueuedMessages ( hostId , pair . Key , out error ) ;
316
312
}
313
+ lastSendTickTime = Time . time ;
317
314
}
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 )
325
316
{
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 )
328
325
{
329
- pendingClients . Add ( clientId ) ;
330
- StartCoroutine ( ApprovalTimeout ( clientId ) ) ;
326
+ //Client timed out.
327
+ if ( isServer )
328
+ {
329
+ OnClientDisconnect ( clientId ) ;
330
+ return ;
331
+ }
331
332
}
332
- else
333
+ else if ( networkError != NetworkError . Ok )
333
334
{
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
+ }
337
338
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
341
348
{
342
- writer . Write ( NetworkConfig . GetConfig ( ) ) ;
349
+ int sizeOfStream = 32 ;
343
350
if ( NetworkConfig . ConnectionApproval )
351
+ sizeOfStream += 2 + NetworkConfig . ConnectionData . Length ;
352
+
353
+ using ( MemoryStream writeStream = new MemoryStream ( sizeOfStream ) )
344
354
{
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 ( ) ) ;
347
365
}
348
366
}
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 ;
351
375
}
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 ;
360
379
}
361
- if ( isServer )
380
+ if ( isServer && ( ( Time . time - lastEventTickTime >= ( 1f / NetworkConfig . EventTickrate ) ) || NetworkConfig . EventTickrate <= 0 ) )
362
381
{
363
382
LagCompensationManager . AddFrames ( ) ;
364
383
NetworkedObject . InvokeSyncvarUpdate ( ) ;
384
+ lastEventTickTime = Time . time ;
365
385
}
366
- lastTickTime = Time . time ;
367
386
}
368
387
}
369
388
@@ -1074,7 +1093,7 @@ private void OnClientDisconnect(int clientId)
1074
1093
{
1075
1094
writer . Write ( clientId ) ;
1076
1095
}
1077
- Send ( "MLAPI_CLIENT_DISCONNECT" , "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED " , stream . GetBuffer ( ) , clientId ) ;
1096
+ Send ( "MLAPI_CLIENT_DISCONNECT" , "MLAPI_INTERNAL " , stream . GetBuffer ( ) , clientId ) ;
1078
1097
}
1079
1098
}
1080
1099
}
@@ -1153,7 +1172,7 @@ private void HandleApproval(int clientId, bool approved)
1153
1172
}
1154
1173
}
1155
1174
}
1156
- Send ( clientId , "MLAPI_CONNECTION_APPROVED" , "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED " , writeStream . GetBuffer ( ) ) ;
1175
+ Send ( clientId , "MLAPI_CONNECTION_APPROVED" , "MLAPI_INTERNAL " , writeStream . GetBuffer ( ) ) ;
1157
1176
}
1158
1177
1159
1178
//Inform old clients of the new player
@@ -1179,7 +1198,7 @@ private void HandleApproval(int clientId, bool approved)
1179
1198
writer . Write ( clientId ) ;
1180
1199
}
1181
1200
}
1182
- Send ( "MLAPI_ADD_OBJECT" , "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED " , stream . GetBuffer ( ) , clientId ) ;
1201
+ Send ( "MLAPI_ADD_OBJECT" , "MLAPI_INTERNAL " , stream . GetBuffer ( ) , clientId ) ;
1183
1202
}
1184
1203
//Flush syncvars:
1185
1204
foreach ( KeyValuePair < uint , NetworkedObject > networkedObject in SpawnManager . spawnedObjects )
0 commit comments