Skip to content

Commit 1623065

Browse files
committed
perf: Fixed delegate alloc on incoming message
1 parent 36d3090 commit 1623065

File tree

3 files changed

+79
-35
lines changed

3 files changed

+79
-35
lines changed

MLAPI/Core/NetworkingManager.cs

Lines changed: 58 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -938,29 +938,6 @@ internal void HandleIncomingData(ulong clientId, string channelName, ArraySegmen
938938
return;
939939
}
940940

941-
942-
void bufferCallback(ulong networkId)
943-
{
944-
if (!allowBuffer)
945-
{
946-
// This is to prevent recursive buffering
947-
if (NetworkLog.CurrentLogLevel <= LogLevel.Error) NetworkLog.LogError("A message of type " + MLAPIConstants.MESSAGE_NAMES[messageType] + " was recursivley buffered. It has been dropped.");
948-
return;
949-
}
950-
951-
if (!NetworkConfig.EnableMessageBuffering)
952-
{
953-
throw new InvalidOperationException("Cannot buffer with buffering disabled.");
954-
}
955-
956-
if (IsServer)
957-
{
958-
throw new InvalidOperationException("Cannot buffer on server.");
959-
}
960-
961-
BufferManager.BufferMessageForNetworkId(networkId, clientId, channelName, receiveTime, data);
962-
}
963-
964941
#region INTERNAL MESSAGE
965942

966943
switch (messageType)
@@ -993,10 +970,26 @@ void bufferCallback(ulong networkId)
993970
if (IsClient) InternalMessageHandler.HandleTimeSync(clientId, messageStream, receiveTime);
994971
break;
995972
case MLAPIConstants.MLAPI_NETWORKED_VAR_DELTA:
996-
InternalMessageHandler.HandleNetworkedVarDelta(clientId, messageStream, bufferCallback);
973+
InternalMessageHandler.HandleNetworkedVarDelta(clientId, messageStream, BufferCallback, new PreBufferPreset()
974+
{
975+
AllowBuffer = allowBuffer,
976+
ChannelName = channelName,
977+
ClientId = clientId,
978+
Data = data,
979+
MessageType = messageType,
980+
ReceiveTime = receiveTime
981+
});
997982
break;
998983
case MLAPIConstants.MLAPI_NETWORKED_VAR_UPDATE:
999-
InternalMessageHandler.HandleNetworkedVarUpdate(clientId, messageStream, bufferCallback);
984+
InternalMessageHandler.HandleNetworkedVarUpdate(clientId, messageStream, BufferCallback, new PreBufferPreset()
985+
{
986+
AllowBuffer = allowBuffer,
987+
ChannelName = channelName,
988+
ClientId = clientId,
989+
Data = data,
990+
MessageType = messageType,
991+
ReceiveTime = receiveTime
992+
});
1000993
break;
1001994
case MLAPIConstants.MLAPI_SERVER_RPC:
1002995
if (IsServer) InternalMessageHandler.HandleServerRPC(clientId, messageStream);
@@ -1008,10 +1001,26 @@ void bufferCallback(ulong networkId)
10081001
if (IsClient) InternalMessageHandler.HandleServerRPCResponse(clientId, messageStream);
10091002
break;
10101003
case MLAPIConstants.MLAPI_CLIENT_RPC:
1011-
if (IsClient) InternalMessageHandler.HandleClientRPC(clientId, messageStream, bufferCallback);
1004+
if (IsClient) InternalMessageHandler.HandleClientRPC(clientId, messageStream, BufferCallback, new PreBufferPreset()
1005+
{
1006+
AllowBuffer = allowBuffer,
1007+
ChannelName = channelName,
1008+
ClientId = clientId,
1009+
Data = data,
1010+
MessageType = messageType,
1011+
ReceiveTime = receiveTime
1012+
});
10121013
break;
10131014
case MLAPIConstants.MLAPI_CLIENT_RPC_REQUEST:
1014-
if (IsClient) InternalMessageHandler.HandleClientRPCRequest(clientId, messageStream, channelName, security, bufferCallback);
1015+
if (IsClient) InternalMessageHandler.HandleClientRPCRequest(clientId, messageStream, channelName, security, BufferCallback, new PreBufferPreset()
1016+
{
1017+
AllowBuffer = allowBuffer,
1018+
ChannelName = channelName,
1019+
ClientId = clientId,
1020+
Data = data,
1021+
MessageType = messageType,
1022+
ReceiveTime = receiveTime
1023+
});
10151024
break;
10161025
case MLAPIConstants.MLAPI_CLIENT_RPC_RESPONSE:
10171026
if (IsServer) InternalMessageHandler.HandleClientRPCResponse(clientId, messageStream);
@@ -1052,6 +1061,28 @@ void bufferCallback(ulong networkId)
10521061
}
10531062
}
10541063

1064+
private void BufferCallback(ulong networkId, PreBufferPreset preset)
1065+
{
1066+
if (!preset.AllowBuffer)
1067+
{
1068+
// This is to prevent recursive buffering
1069+
if (NetworkLog.CurrentLogLevel <= LogLevel.Error) NetworkLog.LogError("A message of type " + MLAPIConstants.MESSAGE_NAMES[preset.MessageType] + " was recursivley buffered. It has been dropped.");
1070+
return;
1071+
}
1072+
1073+
if (!NetworkConfig.EnableMessageBuffering)
1074+
{
1075+
throw new InvalidOperationException("Cannot buffer with buffering disabled.");
1076+
}
1077+
1078+
if (IsServer)
1079+
{
1080+
throw new InvalidOperationException("Cannot buffer on server.");
1081+
}
1082+
1083+
BufferManager.BufferMessageForNetworkId(networkId, preset.ClientId, preset.ChannelName, preset.ReceiveTime, preset.Data);
1084+
}
1085+
10551086
/// <summary>
10561087
/// Disconnects the remote client.
10571088
/// </summary>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
namespace MLAPI.Messaging.Buffering
3+
{
4+
internal struct PreBufferPreset
5+
{
6+
public byte MessageType;
7+
public bool AllowBuffer;
8+
public ulong ClientId;
9+
public string ChannelName;
10+
public float ReceiveTime;
11+
public ArraySegment<byte> Data;
12+
}
13+
}

MLAPI/Messaging/InternalMessageHandler.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ internal static void HandleTimeSync(ulong clientId, Stream stream, float receive
497497
}
498498
}
499499

500-
internal static void HandleNetworkedVarDelta(ulong clientId, Stream stream, Action<ulong> bufferCallback)
500+
internal static void HandleNetworkedVarDelta(ulong clientId, Stream stream, Action<ulong, PreBufferPreset> bufferCallback, PreBufferPreset bufferPreset)
501501
{
502502
if (!NetworkingManager.Singleton.NetworkConfig.EnableNetworkedVar)
503503
{
@@ -530,12 +530,12 @@ internal static void HandleNetworkedVarDelta(ulong clientId, Stream stream, Acti
530530
else
531531
{
532532
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) NetworkLog.LogWarning("NetworkedVarDelta message recieved for a non existant object with id: " + networkId + ". This delta will be buffered and might be recovered.");
533-
bufferCallback(networkId);
533+
bufferCallback(networkId, bufferPreset);
534534
}
535535
}
536536
}
537537

538-
internal static void HandleNetworkedVarUpdate(ulong clientId, Stream stream, Action<ulong> bufferCallback)
538+
internal static void HandleNetworkedVarUpdate(ulong clientId, Stream stream, Action<ulong, PreBufferPreset> bufferCallback, PreBufferPreset bufferPreset)
539539
{
540540
if (!NetworkingManager.Singleton.NetworkConfig.EnableNetworkedVar)
541541
{
@@ -568,7 +568,7 @@ internal static void HandleNetworkedVarUpdate(ulong clientId, Stream stream, Act
568568
else
569569
{
570570
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) NetworkLog.LogWarning("NetworkedVarUpdate message recieved for a non existant object with id: " + networkId + ". This delta will be buffered and might be recovered.");
571-
bufferCallback(networkId);
571+
bufferCallback(networkId, bufferPreset);
572572
}
573573
}
574574
}
@@ -689,7 +689,7 @@ internal static void HandleServerRPCResponse(ulong clientId, Stream stream)
689689
}
690690
}
691691

692-
internal static void HandleClientRPC(ulong clientId, Stream stream, Action<ulong> bufferCallback)
692+
internal static void HandleClientRPC(ulong clientId, Stream stream, Action<ulong, PreBufferPreset> bufferCallback, PreBufferPreset bufferPreset)
693693
{
694694
using (PooledBitReader reader = PooledBitReader.Get(stream))
695695
{
@@ -717,12 +717,12 @@ internal static void HandleClientRPC(ulong clientId, Stream stream, Action<ulong
717717
else
718718
{
719719
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) NetworkLog.LogWarning("ClientRPC message recieved for a non existant object with id: " + networkId + ". This message will be buffered and might be recovered.");
720-
bufferCallback(networkId);
720+
bufferCallback(networkId, bufferPreset);
721721
}
722722
}
723723
}
724724

725-
internal static void HandleClientRPCRequest(ulong clientId, Stream stream, string channelName, SecuritySendFlags security, Action<ulong> bufferCallback)
725+
internal static void HandleClientRPCRequest(ulong clientId, Stream stream, string channelName, SecuritySendFlags security, Action<ulong, PreBufferPreset> bufferCallback, PreBufferPreset bufferPreset)
726726
{
727727
using (PooledBitReader reader = PooledBitReader.Get(stream))
728728
{
@@ -762,7 +762,7 @@ internal static void HandleClientRPCRequest(ulong clientId, Stream stream, strin
762762
else
763763
{
764764
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) NetworkLog.LogWarning("ClientRPCRequest message recieved for a non existant object with id: " + networkId + ". This message will be buffered and might be recovered.");
765-
bufferCallback(networkId);
765+
bufferCallback(networkId, bufferPreset);
766766
}
767767
}
768768
}

0 commit comments

Comments
 (0)