Skip to content

Commit fd059e3

Browse files
committed
Made BitReader pooled
1 parent 813e6ca commit fd059e3

File tree

4 files changed

+238
-173
lines changed

4 files changed

+238
-173
lines changed

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 168 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -760,198 +760,200 @@ private IEnumerator ApprovalTimeout(uint clientId)
760760

761761
private void HandleIncomingData(uint clientId, byte[] data, int channelId)
762762
{
763-
BitReader reader = new BitReader(data);
764-
765-
ushort messageType = reader.ReadUShort();
766-
bool targeted = reader.ReadBool();
767-
uint targetNetworkId = 0;
768-
ushort networkOrderId = 0;
769-
if (targeted)
763+
using (BitReader reader = BitReader.Get(data))
770764
{
771-
targetNetworkId = reader.ReadUInt();
772-
networkOrderId = reader.ReadUShort();
773-
}
774-
bool isPassthrough = reader.ReadBool();
775-
776-
uint passthroughOrigin = 0;
777-
uint passthroughTarget = 0;
778-
779-
if (isPassthrough && isServer)
780-
passthroughTarget = reader.ReadUInt();
781-
else if (isPassthrough && !isServer)
782-
passthroughOrigin = reader.ReadUInt();
783-
765+
ushort messageType = reader.ReadUShort();
766+
bool targeted = reader.ReadBool();
767+
uint targetNetworkId = 0;
768+
ushort networkOrderId = 0;
769+
if (targeted)
770+
{
771+
targetNetworkId = reader.ReadUInt();
772+
networkOrderId = reader.ReadUShort();
773+
}
774+
bool isPassthrough = reader.ReadBool();
784775

785-
//Client tried to send a network message that was not the connection request before he was accepted.
786-
if (isServer && pendingClients.Contains(clientId) && messageType != 0)
787-
{
788-
Debug.LogWarning("MLAPI: Message recieved from clientId " + clientId + " before it has been accepted");
789-
return;
790-
}
776+
uint passthroughOrigin = 0;
777+
uint passthroughTarget = 0;
791778

779+
if (isPassthrough && isServer)
780+
passthroughTarget = reader.ReadUInt();
781+
else if (isPassthrough && !isServer)
782+
passthroughOrigin = reader.ReadUInt();
792783

793-
//ushort bytesToRead = reader.ReadUShort();
794-
reader.SkipPadded();
795-
byte[] readBuffer = null;
796-
if (NetworkConfig.EncryptedChannelsHashSet.Contains(MessageManager.reverseChannels[channelId]))
797-
{
798-
//Encrypted message
799-
if (isServer)
800-
readBuffer = CryptographyHelper.Decrypt(reader.ReadByteArray(), connectedClients[clientId].AesKey);
801-
else
802-
readBuffer = CryptographyHelper.Decrypt(reader.ReadByteArray(), clientAesKey);
803-
}
804784

805-
if (isServer && isPassthrough && !NetworkConfig.PassthroughMessageHashSet.Contains(messageType))
806-
{
807-
Debug.LogWarning("MLAPI: Client " + clientId + " tried to send a passthrough message for a messageType not registered as passthrough");
808-
return;
809-
}
810-
else if (isClient && isPassthrough && !NetworkConfig.PassthroughMessageHashSet.Contains(messageType))
811-
{
812-
Debug.LogWarning("MLAPI: Server tried to send a passthrough message for a messageType not registered as passthrough");
813-
return;
814-
}
815-
else if (isServer && isPassthrough)
816-
{
817-
if (!connectedClients.ContainsKey(passthroughTarget))
785+
//Client tried to send a network message that was not the connection request before he was accepted.
786+
if (isServer && pendingClients.Contains(clientId) && messageType != 0)
818787
{
819-
Debug.LogWarning("MLAPI: Passthrough message was sent with invalid target: " + passthroughTarget + " from client " + clientId);
788+
Debug.LogWarning("MLAPI: Message recieved from clientId " + clientId + " before it has been accepted");
820789
return;
821790
}
822-
uint? netIdTarget = null;
823-
ushort? netOrderId = null;
824-
if (targeted)
791+
792+
reader.SkipPadded();
793+
byte[] readBuffer = null;
794+
if (NetworkConfig.EncryptedChannelsHashSet.Contains(MessageManager.reverseChannels[channelId]))
825795
{
826-
netIdTarget = targetNetworkId;
827-
netOrderId = networkOrderId;
796+
//Encrypted message
797+
if (isServer)
798+
readBuffer = CryptographyHelper.Decrypt(reader.ReadByteArray(), connectedClients[clientId].AesKey);
799+
else
800+
readBuffer = CryptographyHelper.Decrypt(reader.ReadByteArray(), clientAesKey);
828801
}
829-
if (readBuffer == null)
830-
readBuffer = reader.ReadByteArray();
831-
InternalMessageHandler.PassthroughSend(passthroughTarget, clientId, messageType, channelId, readBuffer, netIdTarget, netOrderId);
832-
return;
833-
}
834-
835-
BitReader messageReader = reader;
836-
if (readBuffer != null)
837-
messageReader = new BitReader(reader.ReadByteArray());
838802

839-
if (messageType >= 32)
840-
{
841-
#region CUSTOM MESSAGE
842-
//Custom message, invoke all message handlers
843-
if (targeted)
803+
using (BitReader messageReader = readBuffer == null ? reader : BitReader.Get(readBuffer))
844804
{
845-
if (!SpawnManager.spawnedObjects.ContainsKey(targetNetworkId))
805+
if (isServer && isPassthrough && !NetworkConfig.PassthroughMessageHashSet.Contains(messageType))
846806
{
847-
Debug.LogWarning("MLAPI: No target for message found");
807+
Debug.LogWarning("MLAPI: Client " + clientId + " tried to send a passthrough message for a messageType not registered as passthrough");
808+
messageReader.Dispose();
848809
return;
849810
}
850-
else if (!SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions.ContainsKey(networkOrderId))
811+
else if (isClient && isPassthrough && !NetworkConfig.PassthroughMessageHashSet.Contains(messageType))
851812
{
852-
Debug.LogWarning("MLAPI: No target messageType for message found");
813+
Debug.LogWarning("MLAPI: Server tried to send a passthrough message for a messageType not registered as passthrough");
814+
messageReader.Dispose();
853815
return;
854816
}
855-
else if (!SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId].ContainsKey(messageType))
817+
else if (isServer && isPassthrough)
856818
{
857-
Debug.LogWarning("MLAPI: No target found with the given messageType");
819+
if (!connectedClients.ContainsKey(passthroughTarget))
820+
{
821+
Debug.LogWarning("MLAPI: Passthrough message was sent with invalid target: " + passthroughTarget + " from client " + clientId);
822+
messageReader.Dispose();
823+
return;
824+
}
825+
uint? netIdTarget = null;
826+
ushort? netOrderId = null;
827+
if (targeted)
828+
{
829+
netIdTarget = targetNetworkId;
830+
netOrderId = networkOrderId;
831+
}
832+
InternalMessageHandler.PassthroughSend(passthroughTarget, clientId, messageType, channelId, messageReader, netIdTarget, netOrderId);
858833
return;
859834
}
860-
if (SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId].ContainsKey(messageType))
835+
836+
if (messageType >= 32)
861837
{
862-
SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId][messageType].Invoke(clientId, messageReader);
838+
#region CUSTOM MESSAGE
839+
//Custom message, invoke all message handlers
840+
if (targeted)
841+
{
842+
if (!SpawnManager.spawnedObjects.ContainsKey(targetNetworkId))
843+
{
844+
Debug.LogWarning("MLAPI: No target for message found");
845+
messageReader.Dispose();
846+
return;
847+
}
848+
else if (!SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions.ContainsKey(networkOrderId))
849+
{
850+
Debug.LogWarning("MLAPI: No target messageType for message found");
851+
messageReader.Dispose();
852+
return;
853+
}
854+
else if (!SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId].ContainsKey(messageType))
855+
{
856+
Debug.LogWarning("MLAPI: No target found with the given messageType");
857+
messageReader.Dispose();
858+
return;
859+
}
860+
if (SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId].ContainsKey(messageType))
861+
{
862+
SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId][messageType].Invoke(clientId, messageReader);
863+
}
864+
}
865+
else
866+
{
867+
foreach (KeyValuePair<int, Action<uint, BitReader>> pair in MessageManager.messageCallbacks[messageType])
868+
{
869+
if (isPassthrough)
870+
pair.Value(passthroughOrigin, messageReader);
871+
else
872+
pair.Value(clientId, messageReader);
873+
}
874+
}
875+
#endregion
863876
}
864-
}
865-
else
866-
{
867-
foreach (KeyValuePair<int, Action<uint, BitReader>> pair in MessageManager.messageCallbacks[messageType])
877+
else
868878
{
869-
if (isPassthrough)
870-
pair.Value(passthroughOrigin, messageReader);
871-
else
872-
pair.Value(clientId, messageReader);
879+
#region INTERNAL MESSAGE
880+
//MLAPI message
881+
switch (messageType)
882+
{
883+
case 0: //Client to server > sends connection buffer
884+
if (isServer)
885+
InternalMessageHandler.HandleConnectionRequest(clientId, messageReader, channelId);
886+
break;
887+
case 1: //Server informs client it has been approved:
888+
if (isClient)
889+
InternalMessageHandler.HandleConnectionApproved(clientId, messageReader, channelId);
890+
break;
891+
case 2:
892+
//Server informs client another client connected
893+
//MLAPI_ADD_OBJECT
894+
if (isClient)
895+
InternalMessageHandler.HandleAddObject(clientId, messageReader, channelId);
896+
break;
897+
case 3:
898+
//Server informs client another client disconnected
899+
//MLAPI_CLIENT_DISCONNECT
900+
if (isClient)
901+
InternalMessageHandler.HandleClientDisconnect(clientId, messageReader, channelId);
902+
break;
903+
case 4:
904+
//Server infroms clients to destroy an object
905+
if (isClient)
906+
InternalMessageHandler.HandleDestroyObject(clientId, messageReader, channelId);
907+
break;
908+
case 5:
909+
//Scene switch
910+
if (isClient)
911+
InternalMessageHandler.HandleSwitchScene(clientId, messageReader, channelId);
912+
break;
913+
case 6: //Spawn pool object
914+
if (isClient)
915+
InternalMessageHandler.HandleSpawnPoolObject(clientId, messageReader, channelId);
916+
break;
917+
case 7: //Destroy pool object
918+
if (isClient)
919+
InternalMessageHandler.HandleDestroyPoolObject(clientId, messageReader, channelId);
920+
break;
921+
case 8: //Change owner
922+
if (isClient)
923+
InternalMessageHandler.HandleChangeOwner(clientId, messageReader, channelId);
924+
break;
925+
case 9: //Syncvar
926+
if (isClient)
927+
InternalMessageHandler.HandleSyncVarUpdate(clientId, messageReader, channelId);
928+
break;
929+
case 10:
930+
if (isClient) //MLAPI_ADD_OBJECTS (plural)
931+
InternalMessageHandler.HandleAddObjects(clientId, messageReader, channelId);
932+
break;
933+
case 11:
934+
if (isClient)
935+
InternalMessageHandler.HandleTimeSync(clientId, messageReader, channelId);
936+
break;
937+
case 12:
938+
if (isServer)
939+
InternalMessageHandler.HandleCommand(clientId, messageReader, channelId);
940+
break;
941+
case 13:
942+
if (isClient)
943+
InternalMessageHandler.HandleRpc(clientId, messageReader, channelId);
944+
break;
945+
case 14:
946+
if (isClient)
947+
InternalMessageHandler.HandleTargetRpc(clientId, messageReader, channelId);
948+
break;
949+
case 15:
950+
if (isClient)
951+
InternalMessageHandler.HandleSetVisibility(clientId, messageReader, channelId);
952+
break;
953+
}
954+
#endregion
873955
}
874956
}
875-
#endregion
876-
}
877-
else
878-
{
879-
#region INTERNAL MESSAGE
880-
//MLAPI message
881-
switch (messageType)
882-
{
883-
case 0: //Client to server > sends connection buffer
884-
if (isServer)
885-
InternalMessageHandler.HandleConnectionRequest(clientId, messageReader, channelId);
886-
break;
887-
case 1: //Server informs client it has been approved:
888-
if (isClient)
889-
InternalMessageHandler.HandleConnectionApproved(clientId, messageReader, channelId);
890-
break;
891-
case 2:
892-
//Server informs client another client connected
893-
//MLAPI_ADD_OBJECT
894-
if (isClient)
895-
InternalMessageHandler.HandleAddObject(clientId, messageReader, channelId);
896-
break;
897-
case 3:
898-
//Server informs client another client disconnected
899-
//MLAPI_CLIENT_DISCONNECT
900-
if (isClient)
901-
InternalMessageHandler.HandleClientDisconnect(clientId, messageReader, channelId);
902-
break;
903-
case 4:
904-
//Server infroms clients to destroy an object
905-
if (isClient)
906-
InternalMessageHandler.HandleDestroyObject(clientId, messageReader, channelId);
907-
break;
908-
case 5:
909-
//Scene switch
910-
if (isClient)
911-
InternalMessageHandler.HandleSwitchScene(clientId, messageReader, channelId);
912-
break;
913-
case 6: //Spawn pool object
914-
if (isClient)
915-
InternalMessageHandler.HandleSpawnPoolObject(clientId, messageReader, channelId);
916-
break;
917-
case 7: //Destroy pool object
918-
if (isClient)
919-
InternalMessageHandler.HandleDestroyPoolObject(clientId, messageReader, channelId);
920-
break;
921-
case 8: //Change owner
922-
if (isClient)
923-
InternalMessageHandler.HandleChangeOwner(clientId, messageReader, channelId);
924-
break;
925-
case 9: //Syncvar
926-
if (isClient)
927-
InternalMessageHandler.HandleSyncVarUpdate(clientId, messageReader, channelId);
928-
break;
929-
case 10:
930-
if (isClient) //MLAPI_ADD_OBJECTS (plural)
931-
InternalMessageHandler.HandleAddObjects(clientId, messageReader, channelId);
932-
break;
933-
case 11:
934-
if (isClient)
935-
InternalMessageHandler.HandleTimeSync(clientId, messageReader, channelId);
936-
break;
937-
case 12:
938-
if (isServer)
939-
InternalMessageHandler.HandleCommand(clientId, messageReader, channelId);
940-
break;
941-
case 13:
942-
if (isClient)
943-
InternalMessageHandler.HandleRpc(clientId, messageReader, channelId);
944-
break;
945-
case 14:
946-
if (isClient)
947-
InternalMessageHandler.HandleTargetRpc(clientId, messageReader, channelId);
948-
break;
949-
case 15:
950-
if (isClient)
951-
InternalMessageHandler.HandleSetVisibility(clientId, messageReader, channelId);
952-
break;
953-
}
954-
#endregion
955957
}
956958
}
957959

0 commit comments

Comments
 (0)