From d9242d760fc44845926ee943abf81617824ab39b Mon Sep 17 00:00:00 2001 From: dooly Date: Tue, 28 Jan 2025 13:41:21 +1000 Subject: [PATCH] ton of work to cache arrays of data for recycling --- .../Serializable/AdditionalAvatarData.cs | 5 +++- .../Serializable/AudioSegmentDataMessage.cs | 12 +++++++-- .../Serializable/AuthenticationMessage.cs | 5 +++- .../Serializable/AvatarDataMessage.cs | 14 ++++++++-- .../Serializable/InitalAvatarPayload.cs | 5 +++- .../Serializable/LocalAvatarSyncMessage.cs | 1 + .../Serializable/OwnershipTransferMessage.cs | 27 ++++++++++--------- .../Serializable/PlayerMetaDataMessage.cs | 3 --- .../Serializable/ReadyMessage.cs | 1 - .../Serializable/RemoteAvatarDataMessage.cs | 19 +++++++++---- .../Serializable/SceneDataMessage.cs | 14 ++++++++-- .../Serializable/ServerAudioSegmentMessage.cs | 15 +++++++---- .../Serializable/ServerAvatarChangeMessage.cs | 11 ++++---- .../Serializable/ServerUniqueIDMessage.cs | 27 ++++++++++--------- .../BasisNetworkCore/ThreadSafeMessagePool.cs | 27 +++++++++++++++++++ .../BasisNetworking/BasisNetworkOwnership.cs | 2 +- .../BasisServerHandleEvents.cs | 19 ++++++++----- .../Networking/BasisNetworkManagement.cs | 2 +- .../Handles/BasisNetworkGenericMessages.cs | 1 + .../Serializable/AdditionalAvatarData.cs | 5 +++- .../Serializable/AudioSegmentDataMessage.cs | 12 +++++++-- .../Serializable/AuthenticationMessage.cs | 5 +++- .../Serializable/AvatarDataMessage.cs | 14 ++++++++-- .../Serializable/InitalAvatarPayload.cs | 5 +++- .../Serializable/LocalAvatarSyncMessage.cs | 1 + .../Serializable/OwnershipTransferMessage.cs | 27 ++++++++++--------- .../Serializable/PlayerMetaDataMessage.cs | 3 --- .../Serializable/ReadyMessage.cs | 1 - .../Serializable/RemoteAvatarDataMessage.cs | 19 +++++++++---- .../Serializable/SceneDataMessage.cs | 14 ++++++++-- .../Serializable/ServerAudioSegmentMessage.cs | 15 +++++++---- .../Serializable/ServerAvatarChangeMessage.cs | 11 ++++---- .../Serializable/ServerUniqueIDMessage.cs | 27 ++++++++++--------- .../BasisNetworkCore/ThreadSafeMessagePool.cs | 27 +++++++++++++++++++ .../ThreadSafeMessagePool.cs.meta | 2 ++ .../BasisNetworking/BasisNetworkOwnership.cs | 2 +- .../BasisServerHandleEvents.cs | 19 ++++++++----- Basis/ProjectSettings/ProjectSettings.asset | 2 -- 38 files changed, 294 insertions(+), 127 deletions(-) create mode 100644 Basis Server/BasisNetworkCore/ThreadSafeMessagePool.cs create mode 100644 Basis/Packages/com.basis.server/BasisNetworkCore/ThreadSafeMessagePool.cs create mode 100644 Basis/Packages/com.basis.server/BasisNetworkCore/ThreadSafeMessagePool.cs.meta diff --git a/Basis Server/BasisNetworkCore/Serializable/AdditionalAvatarData.cs b/Basis Server/BasisNetworkCore/Serializable/AdditionalAvatarData.cs index ae6913a5f..620287594 100644 --- a/Basis Server/BasisNetworkCore/Serializable/AdditionalAvatarData.cs +++ b/Basis Server/BasisNetworkCore/Serializable/AdditionalAvatarData.cs @@ -14,7 +14,10 @@ public void Deserialize(NetDataReader Writer) messageIndex = Writer.GetByte(); byte PayloadSize = Writer.GetByte(); - array = new byte[PayloadSize]; + if (array == null || array.Length != PayloadSize) + { + array = new byte[PayloadSize]; + } Writer.GetBytes(array, PayloadSize); //89 * 2 = 178 + 12 + 14 = 204 //now 178 for muscles, 3*4 for position 12, 4*4 for rotation 16-2 (W is half) = 204 diff --git a/Basis Server/BasisNetworkCore/Serializable/AudioSegmentDataMessage.cs b/Basis Server/BasisNetworkCore/Serializable/AudioSegmentDataMessage.cs index 436188e28..957726457 100644 --- a/Basis Server/BasisNetworkCore/Serializable/AudioSegmentDataMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/AudioSegmentDataMessage.cs @@ -14,8 +14,16 @@ public void Deserialize(NetDataReader Writer) } else { - buffer = Writer.GetRemainingBytes(); - LengthUsed = buffer.Length; + if (buffer != null && buffer.Length == Writer.AvailableBytes) + { + Writer.GetBytes(buffer, Writer.AvailableBytes); + LengthUsed = buffer.Length; + } + else + { + buffer = Writer.GetRemainingBytes(); + LengthUsed = buffer.Length; + } // BNL.Log("Get Length was " + LengthUsed); } } diff --git a/Basis Server/BasisNetworkCore/Serializable/AuthenticationMessage.cs b/Basis Server/BasisNetworkCore/Serializable/AuthenticationMessage.cs index 610e7e0e4..8bb4eb390 100644 --- a/Basis Server/BasisNetworkCore/Serializable/AuthenticationMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/AuthenticationMessage.cs @@ -15,7 +15,10 @@ public void Deserialize(NetDataReader Reader) { if (Reader.TryGetUShort(out ushort msgLength)) { - bytes = new byte[msgLength]; + if (bytes == null || bytes.Length != msgLength) + { + bytes = new byte[msgLength]; + } Reader.GetBytes(bytes, msgLength); } else diff --git a/Basis Server/BasisNetworkCore/Serializable/AvatarDataMessage.cs b/Basis Server/BasisNetworkCore/Serializable/AvatarDataMessage.cs index 6b9799eb8..045bdd2ad 100644 --- a/Basis Server/BasisNetworkCore/Serializable/AvatarDataMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/AvatarDataMessage.cs @@ -29,7 +29,10 @@ public void Deserialize(NetDataReader Writer) { throw new ArgumentException($"Invalid recipientsSize: {recipientsSize}"); } - recipients = new ushort[recipientsSize]; + if (recipients == null || recipients.Length != recipientsSize) + { + recipients = new ushort[recipientsSize]; + } // BNL.Log("Recipients is " + recipientsSize); for (int index = 0; index < recipientsSize; index++) { @@ -42,7 +45,14 @@ public void Deserialize(NetDataReader Writer) // Read remaining bytes as payload if (Writer.AvailableBytes > 0) { - payload = Writer.GetRemainingBytes(); + if (payload != null && payload.Length == Writer.AvailableBytes) + { + Writer.GetBytes(payload, Writer.AvailableBytes); + } + else + { + payload = Writer.GetRemainingBytes(); + } } } else diff --git a/Basis Server/BasisNetworkCore/Serializable/InitalAvatarPayload.cs b/Basis Server/BasisNetworkCore/Serializable/InitalAvatarPayload.cs index e0f20e10b..e785cd7f0 100644 --- a/Basis Server/BasisNetworkCore/Serializable/InitalAvatarPayload.cs +++ b/Basis Server/BasisNetworkCore/Serializable/InitalAvatarPayload.cs @@ -30,7 +30,10 @@ public void Deserialize(NetDataReader Writer) { throw new ArgumentException($"Invalid recipientsSize: {payloadSize}"); } - payload = new byte[payloadSize]; + if (payload == null || payload.Length != payloadSize) + { + payload = new byte[payloadSize]; + } if (!Writer.TryGetBytesWithLength(out payload)) { throw new ArgumentException($"Failed to read payload!."); diff --git a/Basis Server/BasisNetworkCore/Serializable/LocalAvatarSyncMessage.cs b/Basis Server/BasisNetworkCore/Serializable/LocalAvatarSyncMessage.cs index 88137c141..f4edff3c1 100644 --- a/Basis Server/BasisNetworkCore/Serializable/LocalAvatarSyncMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/LocalAvatarSyncMessage.cs @@ -1,3 +1,4 @@ +using BasisNetworkCore; using LiteNetLib.Utils; using System.Collections.Generic; public static partial class SerializableBasis diff --git a/Basis Server/BasisNetworkCore/Serializable/OwnershipTransferMessage.cs b/Basis Server/BasisNetworkCore/Serializable/OwnershipTransferMessage.cs index dcbc99cb4..cbfdc49de 100644 --- a/Basis Server/BasisNetworkCore/Serializable/OwnershipTransferMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/OwnershipTransferMessage.cs @@ -1,22 +1,23 @@ using LiteNetLib.Utils; using static SerializableBasis; - namespace DarkRift.Basis_Common.Serializable { - public struct OwnershipTransferMessage + public static partial class SerializableBasis { - public PlayerIdMessage playerIdMessage; - public string ownershipID; - public void Deserialize(NetDataReader Writer) + public struct OwnershipTransferMessage { - playerIdMessage.Deserialize(Writer); - Writer.Get(out ownershipID); - } - public void Serialize(NetDataWriter Writer) - { - playerIdMessage.Serialize(Writer); - Writer.Put(ownershipID); + public PlayerIdMessage playerIdMessage; + public string ownershipID; + public void Deserialize(NetDataReader Writer) + { + playerIdMessage.Deserialize(Writer); + Writer.Get(out ownershipID); + } + public void Serialize(NetDataWriter Writer) + { + playerIdMessage.Serialize(Writer); + Writer.Put(ownershipID); + } } } - } diff --git a/Basis Server/BasisNetworkCore/Serializable/PlayerMetaDataMessage.cs b/Basis Server/BasisNetworkCore/Serializable/PlayerMetaDataMessage.cs index 2ce537a06..4ce908628 100644 --- a/Basis Server/BasisNetworkCore/Serializable/PlayerMetaDataMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/PlayerMetaDataMessage.cs @@ -1,7 +1,4 @@ - -using DarkRift; using LiteNetLib.Utils; - public static partial class SerializableBasis { public struct PlayerMetaDataMessage diff --git a/Basis Server/BasisNetworkCore/Serializable/ReadyMessage.cs b/Basis Server/BasisNetworkCore/Serializable/ReadyMessage.cs index 33fb4546a..8d5d4f424 100644 --- a/Basis Server/BasisNetworkCore/Serializable/ReadyMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/ReadyMessage.cs @@ -1,5 +1,4 @@ using LiteNetLib.Utils; -using static BasisNetworkCore.Serializable.SerializableBasis; public static partial class SerializableBasis { public struct ReadyMessage diff --git a/Basis Server/BasisNetworkCore/Serializable/RemoteAvatarDataMessage.cs b/Basis Server/BasisNetworkCore/Serializable/RemoteAvatarDataMessage.cs index 7ec9335e4..026af689d 100644 --- a/Basis Server/BasisNetworkCore/Serializable/RemoteAvatarDataMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/RemoteAvatarDataMessage.cs @@ -7,7 +7,6 @@ public struct RemoteAvatarDataMessage public PlayerIdMessage PlayerIdMessage; public byte messageIndex; public byte[] payload; - public void Deserialize(NetDataReader Writer) { PlayerIdMessage.Deserialize(Writer); @@ -16,19 +15,29 @@ public void Deserialize(NetDataReader Writer) { throw new ArgumentException("Failed to read messageIndex."); } - if (Writer.AvailableBytes > 0) + if (Writer.AvailableBytes != 0) { - payload = Writer.GetRemainingBytes(); + if (payload != null && payload.Length == Writer.AvailableBytes) + { + Writer.GetBytes(payload, Writer.AvailableBytes); + } + else + { + payload = Writer.GetRemainingBytes(); + } + } + else + { + payload = null; } } - public void Serialize(NetDataWriter Writer) { PlayerIdMessage.Serialize(Writer); // Write the messageIndex Writer.Put(messageIndex); // Write the payload if present - if (payload != null && payload.Length > 0) + if (payload != null && payload.Length != 0) { Writer.Put(payload); } diff --git a/Basis Server/BasisNetworkCore/Serializable/SceneDataMessage.cs b/Basis Server/BasisNetworkCore/Serializable/SceneDataMessage.cs index 2daa06f73..3832295b5 100644 --- a/Basis Server/BasisNetworkCore/Serializable/SceneDataMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/SceneDataMessage.cs @@ -28,7 +28,10 @@ public void Deserialize(NetDataReader Writer) { throw new ArgumentException($"Invalid recipientsSize: {recipientsSize}"); } - recipients = new ushort[recipientsSize]; + if (recipients == null || recipients.Length != recipientsSize) + { + recipients = new ushort[recipientsSize]; + } for (int index = 0; index < recipientsSize; index++) { if (!Writer.TryGetUShort(out recipients[index])) @@ -40,7 +43,14 @@ public void Deserialize(NetDataReader Writer) // Read remaining bytes as payload if (Writer.AvailableBytes > 0) { - payload = Writer.GetRemainingBytes(); + if (payload != null && payload.Length == Writer.AvailableBytes) + { + Writer.GetBytes(payload, Writer.AvailableBytes); + } + else + { + payload = Writer.GetRemainingBytes(); + } } } else diff --git a/Basis Server/BasisNetworkCore/Serializable/ServerAudioSegmentMessage.cs b/Basis Server/BasisNetworkCore/Serializable/ServerAudioSegmentMessage.cs index 830605985..d12989a84 100644 --- a/Basis Server/BasisNetworkCore/Serializable/ServerAudioSegmentMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/ServerAudioSegmentMessage.cs @@ -27,8 +27,10 @@ public void Deserialize(NetDataReader Writer) int ushortCount = remainingBytes / sizeof(ushort); // Initialize the array with the calculated size - users = new ushort[ushortCount]; - + if (users == null || users.Length != ushortCount) + { + users = new ushort[ushortCount]; + } // Read each ushort value into the array for (int index = 0; index < ushortCount; index++) { @@ -37,10 +39,13 @@ public void Deserialize(NetDataReader Writer) } public void Serialize(NetDataWriter Writer) { - int Count = users.Length; - for (int Index = 0; Index < Count; Index++) + if (users != null) { - Writer.Put(users[Index]); + int Count = users.Length; + for (int Index = 0; Index < Count; Index++) + { + Writer.Put(users[Index]); + } } } } diff --git a/Basis Server/BasisNetworkCore/Serializable/ServerAvatarChangeMessage.cs b/Basis Server/BasisNetworkCore/Serializable/ServerAvatarChangeMessage.cs index 4d90ebdd4..22ab32236 100644 --- a/Basis Server/BasisNetworkCore/Serializable/ServerAvatarChangeMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/ServerAvatarChangeMessage.cs @@ -30,7 +30,11 @@ public void Deserialize(NetDataReader Writer) // Read the load mode loadMode = Writer.GetByte(); // Initialize the byte array with the specified length - byteArray = new byte[Writer.GetUShort()]; + ushort Length = Writer.GetUShort(); + if (byteArray == null || byteArray.Length != Length) + { + byteArray = new byte[Length]; + } // Read each byte manually into the array Writer.GetBytes(byteArray, 0, byteArray.Length); @@ -44,11 +48,6 @@ public void Deserialize(NetDataReader Writer) } */ } - - public void Dispose() - { - } - public void Serialize(NetDataWriter Writer) { // Write the load mode diff --git a/Basis Server/BasisNetworkCore/Serializable/ServerUniqueIDMessage.cs b/Basis Server/BasisNetworkCore/Serializable/ServerUniqueIDMessage.cs index 000ca5ddc..192d40bba 100644 --- a/Basis Server/BasisNetworkCore/Serializable/ServerUniqueIDMessage.cs +++ b/Basis Server/BasisNetworkCore/Serializable/ServerUniqueIDMessage.cs @@ -1,6 +1,4 @@ using LiteNetLib.Utils; -using System; - namespace BasisNetworkCore.Serializable { public static partial class SerializableBasis @@ -34,7 +32,7 @@ public void Deserialize(NetDataReader reader) } else { - Console.Error.WriteLine($"Unable to read remaining bytes: {bytes}"); + BNL.LogError($"Unable to read remaining bytes: {bytes}"); } } @@ -46,7 +44,7 @@ public void Serialize(NetDataWriter writer) } else { - Console.Error.WriteLine("Unable to serialize. Field was null or empty."); + BNL.LogError("Unable to serialize. Field was null or empty."); } } } @@ -64,7 +62,7 @@ public void Deserialize(NetDataReader reader) } else { - Console.Error.WriteLine($"Unable to read remaining bytes: {bytes}"); + BNL.LogError($"Unable to read remaining bytes: {bytes}"); } } @@ -85,16 +83,20 @@ public void Deserialize(NetDataReader reader) if (bytes >= sizeof(ushort)) { MessageCount = reader.GetUShort(); - Messages = new ServerNetIDMessage[MessageCount]; - for (int i = 0; i < MessageCount; i++) + if (Messages == null || Messages.Length != MessageCount) + { + Messages = new ServerNetIDMessage[MessageCount]; + } + for (int Index = 0; Index < MessageCount; Index++) { - Messages[i] = new ServerNetIDMessage(); - Messages[i].Deserialize(reader); + Messages[Index] = new ServerNetIDMessage(); + Messages[Index].Deserialize(reader); } } else { - Console.Error.WriteLine($"Unable to read remaining bytes for MessageCount. Available: {bytes}"); + Messages = null; + BNL.LogError($"Unable to read remaining bytes for MessageCount. Available: {bytes}"); } } @@ -103,14 +105,15 @@ public void Serialize(NetDataWriter writer) if (Messages != null) { writer.Put((ushort)Messages.Length); - foreach (var message in Messages) + for (int Index = 0; Index < Messages.Length; Index++) { + ServerNetIDMessage message = Messages[Index]; message.Serialize(writer); } } else { - Console.Error.WriteLine("Unable to serialize. Messages array was null."); + BNL.LogError("Unable to serialize. Messages array was null."); } } } diff --git a/Basis Server/BasisNetworkCore/ThreadSafeMessagePool.cs b/Basis Server/BasisNetworkCore/ThreadSafeMessagePool.cs new file mode 100644 index 000000000..4256429a0 --- /dev/null +++ b/Basis Server/BasisNetworkCore/ThreadSafeMessagePool.cs @@ -0,0 +1,27 @@ +using System.Collections.Concurrent; + +namespace BasisNetworkCore +{ + public static class ThreadSafeMessagePool where T : new() + { + private static readonly ConcurrentStack pool = new ConcurrentStack(); + private static readonly int maxPoolSize = 500; // Maximum allowed size of the pool + + public static T Rent() + { + if (pool.TryPop(out T obj)) + { + return obj; + } + return new T(); + } + + public static void Return(T obj) + { + if (pool.Count < maxPoolSize) // Check if the pool size is within the limit + { + pool.Push(obj); + } + } + } +} diff --git a/Basis Server/BasisNetworkServer/BasisNetworking/BasisNetworkOwnership.cs b/Basis Server/BasisNetworkServer/BasisNetworking/BasisNetworkOwnership.cs index 1c8970e71..99f895542 100644 --- a/Basis Server/BasisNetworkServer/BasisNetworking/BasisNetworkOwnership.cs +++ b/Basis Server/BasisNetworkServer/BasisNetworking/BasisNetworkOwnership.cs @@ -1,10 +1,10 @@ using Basis.Network.Core; using BasisNetworkCore; -using DarkRift.Basis_Common.Serializable; using LiteNetLib; using LiteNetLib.Utils; using System.Collections.Concurrent; using System.Collections.Generic; +using static DarkRift.Basis_Common.Serializable.SerializableBasis; namespace Basis.Network.Server.Ownership { public static class BasisNetworkOwnership diff --git a/Basis Server/BasisNetworkServer/BasisServerHandleEvents.cs b/Basis Server/BasisNetworkServer/BasisServerHandleEvents.cs index 7c6119f4c..6567d52bd 100644 --- a/Basis Server/BasisNetworkServer/BasisServerHandleEvents.cs +++ b/Basis Server/BasisNetworkServer/BasisServerHandleEvents.cs @@ -81,7 +81,7 @@ public static void CleanupPlayerData(ushort id, NetPeer peer) BasisNetworkOwnership.RemovePlayerOwnership(id); BasisSavedState.RemovePlayer(peer); BasisServerReductionSystem.RemovePlayer(peer); - if (Peers.Count == 0) + if (Peers.IsEmpty) { BasisNetworkIDDatabase.Reset(); BasisNetworkResourceManagement.Reset(); @@ -158,20 +158,23 @@ public static void HandleConnectionRequest(ConnectionRequest request) chunkedNetPeerArray.SetPeer(PeerId, newPeer); BasisPlayerArray.AddPlayer(newPeer); BNL.Log($"Peer connected: {newPeer.Id}"); - ReadyMessage readyMessage = new ReadyMessage(); + + ReadyMessage readyMessage = ThreadSafeMessagePool.Rent(); + + readyMessage.Deserialize(request.Data, false); if (readyMessage.WasDeserializedCorrectly()) { ServerNetIDMessage[] SUIM = BasisNetworkIDDatabase.GetAllNetworkID(); - ServerUniqueIDMessages ServerUniqueIDMessageArray = new ServerUniqueIDMessages - { - Messages = SUIM - }; + ServerUniqueIDMessages ServerUniqueIDMessageArray = ThreadSafeMessagePool.Rent(); + ServerUniqueIDMessageArray.Messages = SUIM; + NetDataWriter Writer = new NetDataWriter(true, 4); ServerUniqueIDMessageArray.Serialize(Writer); newPeer.Send(Writer, BasisNetworkCommons.NetIDAssigns, DeliveryMethod.ReliableOrdered); SendRemoteSpawnMessage(newPeer, readyMessage); BasisNetworkResourceManagement.SendOutAllResources(newPeer); + ThreadSafeMessagePool.Return(ServerUniqueIDMessageArray); } else { @@ -179,6 +182,7 @@ public static void HandleConnectionRequest(ConnectionRequest request) BasisPlayerArray.RemovePlayer(newPeer); RejectWithReason(request, "Payload Provided was invalid!"); } + ThreadSafeMessagePool.Return(readyMessage); } else { @@ -326,7 +330,7 @@ public static ServerSideSyncPlayerMessage CreateServerSideSyncPlayerMessage(Loca public static void HandleVoiceMessage(NetPacketReader Reader, NetPeer peer) { - AudioSegmentDataMessage audioSegment = new AudioSegmentDataMessage(); + AudioSegmentDataMessage audioSegment = ThreadSafeMessagePool.Rent(); audioSegment.Deserialize(Reader); Reader.Recycle(); ServerAudioSegmentMessage ServerAudio = new ServerAudioSegmentMessage @@ -334,6 +338,7 @@ public static void HandleVoiceMessage(NetPacketReader Reader, NetPeer peer) audioSegmentData = audioSegment }; SendVoiceMessageToClients(ServerAudio, BasisNetworkCommons.VoiceChannel, peer); + ThreadSafeMessagePool.Return(audioSegment); } public static void SendVoiceMessageToClients(ServerAudioSegmentMessage audioSegment, byte channel, NetPeer sender) diff --git a/Basis/Packages/com.basis.framework/Networking/BasisNetworkManagement.cs b/Basis/Packages/com.basis.framework/Networking/BasisNetworkManagement.cs index 9de26b77b..c9c4de529 100644 --- a/Basis/Packages/com.basis.framework/Networking/BasisNetworkManagement.cs +++ b/Basis/Packages/com.basis.framework/Networking/BasisNetworkManagement.cs @@ -7,7 +7,6 @@ using Basis.Scripts.Networking.Transmitters; using Basis.Scripts.Profiler; using Basis.Scripts.TransformBinders.BoneControl; -using DarkRift.Basis_Common.Serializable; using LiteNetLib; using LiteNetLib.Utils; using System; @@ -20,6 +19,7 @@ using UnityEngine; using UnityEngine.SceneManagement; using static BasisNetworkGenericMessages; +using static DarkRift.Basis_Common.Serializable.SerializableBasis; using static SerializableBasis; namespace Basis.Scripts.Networking { diff --git a/Basis/Packages/com.basis.framework/Networking/Handles/BasisNetworkGenericMessages.cs b/Basis/Packages/com.basis.framework/Networking/Handles/BasisNetworkGenericMessages.cs index aa5d168ed..19049a5f1 100644 --- a/Basis/Packages/com.basis.framework/Networking/Handles/BasisNetworkGenericMessages.cs +++ b/Basis/Packages/com.basis.framework/Networking/Handles/BasisNetworkGenericMessages.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using UnityEngine; using static BasisNetworkCore.Serializable.SerializableBasis; +using static DarkRift.Basis_Common.Serializable.SerializableBasis; using static SerializableBasis; diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AdditionalAvatarData.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AdditionalAvatarData.cs index ae6913a5f..620287594 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AdditionalAvatarData.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AdditionalAvatarData.cs @@ -14,7 +14,10 @@ public void Deserialize(NetDataReader Writer) messageIndex = Writer.GetByte(); byte PayloadSize = Writer.GetByte(); - array = new byte[PayloadSize]; + if (array == null || array.Length != PayloadSize) + { + array = new byte[PayloadSize]; + } Writer.GetBytes(array, PayloadSize); //89 * 2 = 178 + 12 + 14 = 204 //now 178 for muscles, 3*4 for position 12, 4*4 for rotation 16-2 (W is half) = 204 diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AudioSegmentDataMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AudioSegmentDataMessage.cs index 436188e28..957726457 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AudioSegmentDataMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AudioSegmentDataMessage.cs @@ -14,8 +14,16 @@ public void Deserialize(NetDataReader Writer) } else { - buffer = Writer.GetRemainingBytes(); - LengthUsed = buffer.Length; + if (buffer != null && buffer.Length == Writer.AvailableBytes) + { + Writer.GetBytes(buffer, Writer.AvailableBytes); + LengthUsed = buffer.Length; + } + else + { + buffer = Writer.GetRemainingBytes(); + LengthUsed = buffer.Length; + } // BNL.Log("Get Length was " + LengthUsed); } } diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AuthenticationMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AuthenticationMessage.cs index 610e7e0e4..8bb4eb390 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AuthenticationMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AuthenticationMessage.cs @@ -15,7 +15,10 @@ public void Deserialize(NetDataReader Reader) { if (Reader.TryGetUShort(out ushort msgLength)) { - bytes = new byte[msgLength]; + if (bytes == null || bytes.Length != msgLength) + { + bytes = new byte[msgLength]; + } Reader.GetBytes(bytes, msgLength); } else diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AvatarDataMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AvatarDataMessage.cs index 6b9799eb8..045bdd2ad 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AvatarDataMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/AvatarDataMessage.cs @@ -29,7 +29,10 @@ public void Deserialize(NetDataReader Writer) { throw new ArgumentException($"Invalid recipientsSize: {recipientsSize}"); } - recipients = new ushort[recipientsSize]; + if (recipients == null || recipients.Length != recipientsSize) + { + recipients = new ushort[recipientsSize]; + } // BNL.Log("Recipients is " + recipientsSize); for (int index = 0; index < recipientsSize; index++) { @@ -42,7 +45,14 @@ public void Deserialize(NetDataReader Writer) // Read remaining bytes as payload if (Writer.AvailableBytes > 0) { - payload = Writer.GetRemainingBytes(); + if (payload != null && payload.Length == Writer.AvailableBytes) + { + Writer.GetBytes(payload, Writer.AvailableBytes); + } + else + { + payload = Writer.GetRemainingBytes(); + } } } else diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/InitalAvatarPayload.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/InitalAvatarPayload.cs index e0f20e10b..e785cd7f0 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/InitalAvatarPayload.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/InitalAvatarPayload.cs @@ -30,7 +30,10 @@ public void Deserialize(NetDataReader Writer) { throw new ArgumentException($"Invalid recipientsSize: {payloadSize}"); } - payload = new byte[payloadSize]; + if (payload == null || payload.Length != payloadSize) + { + payload = new byte[payloadSize]; + } if (!Writer.TryGetBytesWithLength(out payload)) { throw new ArgumentException($"Failed to read payload!."); diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/LocalAvatarSyncMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/LocalAvatarSyncMessage.cs index 88137c141..f4edff3c1 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/LocalAvatarSyncMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/LocalAvatarSyncMessage.cs @@ -1,3 +1,4 @@ +using BasisNetworkCore; using LiteNetLib.Utils; using System.Collections.Generic; public static partial class SerializableBasis diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/OwnershipTransferMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/OwnershipTransferMessage.cs index dcbc99cb4..cbfdc49de 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/OwnershipTransferMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/OwnershipTransferMessage.cs @@ -1,22 +1,23 @@ using LiteNetLib.Utils; using static SerializableBasis; - namespace DarkRift.Basis_Common.Serializable { - public struct OwnershipTransferMessage + public static partial class SerializableBasis { - public PlayerIdMessage playerIdMessage; - public string ownershipID; - public void Deserialize(NetDataReader Writer) + public struct OwnershipTransferMessage { - playerIdMessage.Deserialize(Writer); - Writer.Get(out ownershipID); - } - public void Serialize(NetDataWriter Writer) - { - playerIdMessage.Serialize(Writer); - Writer.Put(ownershipID); + public PlayerIdMessage playerIdMessage; + public string ownershipID; + public void Deserialize(NetDataReader Writer) + { + playerIdMessage.Deserialize(Writer); + Writer.Get(out ownershipID); + } + public void Serialize(NetDataWriter Writer) + { + playerIdMessage.Serialize(Writer); + Writer.Put(ownershipID); + } } } - } diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/PlayerMetaDataMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/PlayerMetaDataMessage.cs index 2ce537a06..4ce908628 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/PlayerMetaDataMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/PlayerMetaDataMessage.cs @@ -1,7 +1,4 @@ - -using DarkRift; using LiteNetLib.Utils; - public static partial class SerializableBasis { public struct PlayerMetaDataMessage diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ReadyMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ReadyMessage.cs index 33fb4546a..8d5d4f424 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ReadyMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ReadyMessage.cs @@ -1,5 +1,4 @@ using LiteNetLib.Utils; -using static BasisNetworkCore.Serializable.SerializableBasis; public static partial class SerializableBasis { public struct ReadyMessage diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/RemoteAvatarDataMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/RemoteAvatarDataMessage.cs index 7ec9335e4..026af689d 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/RemoteAvatarDataMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/RemoteAvatarDataMessage.cs @@ -7,7 +7,6 @@ public struct RemoteAvatarDataMessage public PlayerIdMessage PlayerIdMessage; public byte messageIndex; public byte[] payload; - public void Deserialize(NetDataReader Writer) { PlayerIdMessage.Deserialize(Writer); @@ -16,19 +15,29 @@ public void Deserialize(NetDataReader Writer) { throw new ArgumentException("Failed to read messageIndex."); } - if (Writer.AvailableBytes > 0) + if (Writer.AvailableBytes != 0) { - payload = Writer.GetRemainingBytes(); + if (payload != null && payload.Length == Writer.AvailableBytes) + { + Writer.GetBytes(payload, Writer.AvailableBytes); + } + else + { + payload = Writer.GetRemainingBytes(); + } + } + else + { + payload = null; } } - public void Serialize(NetDataWriter Writer) { PlayerIdMessage.Serialize(Writer); // Write the messageIndex Writer.Put(messageIndex); // Write the payload if present - if (payload != null && payload.Length > 0) + if (payload != null && payload.Length != 0) { Writer.Put(payload); } diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/SceneDataMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/SceneDataMessage.cs index 2daa06f73..3832295b5 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/SceneDataMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/SceneDataMessage.cs @@ -28,7 +28,10 @@ public void Deserialize(NetDataReader Writer) { throw new ArgumentException($"Invalid recipientsSize: {recipientsSize}"); } - recipients = new ushort[recipientsSize]; + if (recipients == null || recipients.Length != recipientsSize) + { + recipients = new ushort[recipientsSize]; + } for (int index = 0; index < recipientsSize; index++) { if (!Writer.TryGetUShort(out recipients[index])) @@ -40,7 +43,14 @@ public void Deserialize(NetDataReader Writer) // Read remaining bytes as payload if (Writer.AvailableBytes > 0) { - payload = Writer.GetRemainingBytes(); + if (payload != null && payload.Length == Writer.AvailableBytes) + { + Writer.GetBytes(payload, Writer.AvailableBytes); + } + else + { + payload = Writer.GetRemainingBytes(); + } } } else diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerAudioSegmentMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerAudioSegmentMessage.cs index 830605985..d12989a84 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerAudioSegmentMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerAudioSegmentMessage.cs @@ -27,8 +27,10 @@ public void Deserialize(NetDataReader Writer) int ushortCount = remainingBytes / sizeof(ushort); // Initialize the array with the calculated size - users = new ushort[ushortCount]; - + if (users == null || users.Length != ushortCount) + { + users = new ushort[ushortCount]; + } // Read each ushort value into the array for (int index = 0; index < ushortCount; index++) { @@ -37,10 +39,13 @@ public void Deserialize(NetDataReader Writer) } public void Serialize(NetDataWriter Writer) { - int Count = users.Length; - for (int Index = 0; Index < Count; Index++) + if (users != null) { - Writer.Put(users[Index]); + int Count = users.Length; + for (int Index = 0; Index < Count; Index++) + { + Writer.Put(users[Index]); + } } } } diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerAvatarChangeMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerAvatarChangeMessage.cs index 4d90ebdd4..22ab32236 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerAvatarChangeMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerAvatarChangeMessage.cs @@ -30,7 +30,11 @@ public void Deserialize(NetDataReader Writer) // Read the load mode loadMode = Writer.GetByte(); // Initialize the byte array with the specified length - byteArray = new byte[Writer.GetUShort()]; + ushort Length = Writer.GetUShort(); + if (byteArray == null || byteArray.Length != Length) + { + byteArray = new byte[Length]; + } // Read each byte manually into the array Writer.GetBytes(byteArray, 0, byteArray.Length); @@ -44,11 +48,6 @@ public void Deserialize(NetDataReader Writer) } */ } - - public void Dispose() - { - } - public void Serialize(NetDataWriter Writer) { // Write the load mode diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerUniqueIDMessage.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerUniqueIDMessage.cs index 000ca5ddc..192d40bba 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerUniqueIDMessage.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/Serializable/ServerUniqueIDMessage.cs @@ -1,6 +1,4 @@ using LiteNetLib.Utils; -using System; - namespace BasisNetworkCore.Serializable { public static partial class SerializableBasis @@ -34,7 +32,7 @@ public void Deserialize(NetDataReader reader) } else { - Console.Error.WriteLine($"Unable to read remaining bytes: {bytes}"); + BNL.LogError($"Unable to read remaining bytes: {bytes}"); } } @@ -46,7 +44,7 @@ public void Serialize(NetDataWriter writer) } else { - Console.Error.WriteLine("Unable to serialize. Field was null or empty."); + BNL.LogError("Unable to serialize. Field was null or empty."); } } } @@ -64,7 +62,7 @@ public void Deserialize(NetDataReader reader) } else { - Console.Error.WriteLine($"Unable to read remaining bytes: {bytes}"); + BNL.LogError($"Unable to read remaining bytes: {bytes}"); } } @@ -85,16 +83,20 @@ public void Deserialize(NetDataReader reader) if (bytes >= sizeof(ushort)) { MessageCount = reader.GetUShort(); - Messages = new ServerNetIDMessage[MessageCount]; - for (int i = 0; i < MessageCount; i++) + if (Messages == null || Messages.Length != MessageCount) + { + Messages = new ServerNetIDMessage[MessageCount]; + } + for (int Index = 0; Index < MessageCount; Index++) { - Messages[i] = new ServerNetIDMessage(); - Messages[i].Deserialize(reader); + Messages[Index] = new ServerNetIDMessage(); + Messages[Index].Deserialize(reader); } } else { - Console.Error.WriteLine($"Unable to read remaining bytes for MessageCount. Available: {bytes}"); + Messages = null; + BNL.LogError($"Unable to read remaining bytes for MessageCount. Available: {bytes}"); } } @@ -103,14 +105,15 @@ public void Serialize(NetDataWriter writer) if (Messages != null) { writer.Put((ushort)Messages.Length); - foreach (var message in Messages) + for (int Index = 0; Index < Messages.Length; Index++) { + ServerNetIDMessage message = Messages[Index]; message.Serialize(writer); } } else { - Console.Error.WriteLine("Unable to serialize. Messages array was null."); + BNL.LogError("Unable to serialize. Messages array was null."); } } } diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/ThreadSafeMessagePool.cs b/Basis/Packages/com.basis.server/BasisNetworkCore/ThreadSafeMessagePool.cs new file mode 100644 index 000000000..4256429a0 --- /dev/null +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/ThreadSafeMessagePool.cs @@ -0,0 +1,27 @@ +using System.Collections.Concurrent; + +namespace BasisNetworkCore +{ + public static class ThreadSafeMessagePool where T : new() + { + private static readonly ConcurrentStack pool = new ConcurrentStack(); + private static readonly int maxPoolSize = 500; // Maximum allowed size of the pool + + public static T Rent() + { + if (pool.TryPop(out T obj)) + { + return obj; + } + return new T(); + } + + public static void Return(T obj) + { + if (pool.Count < maxPoolSize) // Check if the pool size is within the limit + { + pool.Push(obj); + } + } + } +} diff --git a/Basis/Packages/com.basis.server/BasisNetworkCore/ThreadSafeMessagePool.cs.meta b/Basis/Packages/com.basis.server/BasisNetworkCore/ThreadSafeMessagePool.cs.meta new file mode 100644 index 000000000..6d31d66cc --- /dev/null +++ b/Basis/Packages/com.basis.server/BasisNetworkCore/ThreadSafeMessagePool.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d3154c04d8725e14a8f43794a8710960 \ No newline at end of file diff --git a/Basis/Packages/com.basis.server/BasisNetworkServer/BasisNetworking/BasisNetworkOwnership.cs b/Basis/Packages/com.basis.server/BasisNetworkServer/BasisNetworking/BasisNetworkOwnership.cs index 1c8970e71..99f895542 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkServer/BasisNetworking/BasisNetworkOwnership.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkServer/BasisNetworking/BasisNetworkOwnership.cs @@ -1,10 +1,10 @@ using Basis.Network.Core; using BasisNetworkCore; -using DarkRift.Basis_Common.Serializable; using LiteNetLib; using LiteNetLib.Utils; using System.Collections.Concurrent; using System.Collections.Generic; +using static DarkRift.Basis_Common.Serializable.SerializableBasis; namespace Basis.Network.Server.Ownership { public static class BasisNetworkOwnership diff --git a/Basis/Packages/com.basis.server/BasisNetworkServer/BasisServerHandleEvents.cs b/Basis/Packages/com.basis.server/BasisNetworkServer/BasisServerHandleEvents.cs index 7c6119f4c..6567d52bd 100644 --- a/Basis/Packages/com.basis.server/BasisNetworkServer/BasisServerHandleEvents.cs +++ b/Basis/Packages/com.basis.server/BasisNetworkServer/BasisServerHandleEvents.cs @@ -81,7 +81,7 @@ public static void CleanupPlayerData(ushort id, NetPeer peer) BasisNetworkOwnership.RemovePlayerOwnership(id); BasisSavedState.RemovePlayer(peer); BasisServerReductionSystem.RemovePlayer(peer); - if (Peers.Count == 0) + if (Peers.IsEmpty) { BasisNetworkIDDatabase.Reset(); BasisNetworkResourceManagement.Reset(); @@ -158,20 +158,23 @@ public static void HandleConnectionRequest(ConnectionRequest request) chunkedNetPeerArray.SetPeer(PeerId, newPeer); BasisPlayerArray.AddPlayer(newPeer); BNL.Log($"Peer connected: {newPeer.Id}"); - ReadyMessage readyMessage = new ReadyMessage(); + + ReadyMessage readyMessage = ThreadSafeMessagePool.Rent(); + + readyMessage.Deserialize(request.Data, false); if (readyMessage.WasDeserializedCorrectly()) { ServerNetIDMessage[] SUIM = BasisNetworkIDDatabase.GetAllNetworkID(); - ServerUniqueIDMessages ServerUniqueIDMessageArray = new ServerUniqueIDMessages - { - Messages = SUIM - }; + ServerUniqueIDMessages ServerUniqueIDMessageArray = ThreadSafeMessagePool.Rent(); + ServerUniqueIDMessageArray.Messages = SUIM; + NetDataWriter Writer = new NetDataWriter(true, 4); ServerUniqueIDMessageArray.Serialize(Writer); newPeer.Send(Writer, BasisNetworkCommons.NetIDAssigns, DeliveryMethod.ReliableOrdered); SendRemoteSpawnMessage(newPeer, readyMessage); BasisNetworkResourceManagement.SendOutAllResources(newPeer); + ThreadSafeMessagePool.Return(ServerUniqueIDMessageArray); } else { @@ -179,6 +182,7 @@ public static void HandleConnectionRequest(ConnectionRequest request) BasisPlayerArray.RemovePlayer(newPeer); RejectWithReason(request, "Payload Provided was invalid!"); } + ThreadSafeMessagePool.Return(readyMessage); } else { @@ -326,7 +330,7 @@ public static ServerSideSyncPlayerMessage CreateServerSideSyncPlayerMessage(Loca public static void HandleVoiceMessage(NetPacketReader Reader, NetPeer peer) { - AudioSegmentDataMessage audioSegment = new AudioSegmentDataMessage(); + AudioSegmentDataMessage audioSegment = ThreadSafeMessagePool.Rent(); audioSegment.Deserialize(Reader); Reader.Recycle(); ServerAudioSegmentMessage ServerAudio = new ServerAudioSegmentMessage @@ -334,6 +338,7 @@ public static void HandleVoiceMessage(NetPacketReader Reader, NetPeer peer) audioSegmentData = audioSegment }; SendVoiceMessageToClients(ServerAudio, BasisNetworkCommons.VoiceChannel, peer); + ThreadSafeMessagePool.Return(audioSegment); } public static void SendVoiceMessageToClients(ServerAudioSegmentMessage audioSegment, byte channel, NetPeer sender) diff --git a/Basis/ProjectSettings/ProjectSettings.asset b/Basis/ProjectSettings/ProjectSettings.asset index 485aaf016..eff0b955d 100644 --- a/Basis/ProjectSettings/ProjectSettings.asset +++ b/Basis/ProjectSettings/ProjectSettings.asset @@ -144,8 +144,6 @@ PlayerSettings: preloadedAssets: - {fileID: 11400000, guid: cf469a9a31a25dc449c2537cb0b17ad6, type: 2} - {fileID: -944628639613478452, guid: 5e4c3601c6a155f43af19da3bdd35a64, type: 3} - - {fileID: -5957691810772215966, guid: 1d5aae00e097ba9419be9ec26ccae856, type: 2} - - {fileID: 4183660298247459095, guid: ad3dbbd57db07a1488d166f19ed6e7dc, type: 2} metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1