From 3787cb03b24df315a2cd7c87b9e7922d2ec09ce7 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 15:57:22 +0100 Subject: [PATCH 01/14] cleanup NetworkTransport API --- .../Runtime/Transports/NetworkTransport.cs | 107 ++---------------- 1 file changed, 7 insertions(+), 100 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs index 555294cb90..e3e5483ec9 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs @@ -1,42 +1,10 @@ using System; -using System.Collections.Generic; using UnityEngine; namespace Unity.Netcode { - public enum NetworkChannel : byte - { - Internal, - TimeSync, - ReliableRpc, - UnreliableRpc, - SyncChannel, - DefaultMessage, - PositionUpdate, - AnimationUpdate, - NavAgentState, - NavAgentCorrection, - NetworkVariable, //todo: this channel will be used for snapshotting and should then go from reliable to unreliable - SnapshotExchange, - Fragmented, - ChannelUnused, // <<-- must be present, and must be last - }; - - /// - /// A network transport - /// public abstract class NetworkTransport : MonoBehaviour { - /// - /// Delegate used to request channels on the underlying transport. - /// - public delegate void RequestChannelsDelegate(List channels); - - /// - /// Delegate called when the transport wants to know what channels to register. - /// - public event RequestChannelsDelegate OnChannelRegistration; - /// /// A constant clientId that represents the server. /// When this value is found in methods such as Send, it should be treated as a placeholder that means "the server" @@ -50,69 +18,10 @@ public abstract class NetworkTransport : MonoBehaviour /// true if is supported; otherwise, false. public virtual bool IsSupported => true; - private TransportChannel[] m_ChannelsCache = null; - - internal void ResetChannelCache() - { - m_ChannelsCache = null; - } - - public TransportChannel[] NETCODE_CHANNELS - { - get - { - if (m_ChannelsCache == null) - { - var transportChannels = new List(); - - OnChannelRegistration?.Invoke(transportChannels); - - m_ChannelsCache = new TransportChannel[NETCODE_INTERNAL_CHANNELS.Length + transportChannels.Count]; - - for (int i = 0; i < NETCODE_INTERNAL_CHANNELS.Length; i++) - { - m_ChannelsCache[i] = NETCODE_INTERNAL_CHANNELS[i]; - } - - for (int i = 0; i < transportChannels.Count; i++) - { - m_ChannelsCache[i + NETCODE_INTERNAL_CHANNELS.Length] = transportChannels[i]; - } - } - - return m_ChannelsCache; - } - } - - /// - /// The channels the Netcode will use when sending internal messages. - /// -#pragma warning disable IDE1006 // disable naming rule violation check - private readonly TransportChannel[] NETCODE_INTERNAL_CHANNELS = -#pragma warning restore IDE1006 // restore naming rule violation check - { - new TransportChannel(NetworkChannel.Internal, NetworkDelivery.ReliableSequenced), - new TransportChannel(NetworkChannel.ReliableRpc, NetworkDelivery.ReliableSequenced), - new TransportChannel(NetworkChannel.UnreliableRpc, NetworkDelivery.UnreliableSequenced), - new TransportChannel(NetworkChannel.TimeSync, NetworkDelivery.Unreliable), - new TransportChannel(NetworkChannel.SyncChannel, NetworkDelivery.Unreliable), - new TransportChannel(NetworkChannel.DefaultMessage, NetworkDelivery.Reliable), - new TransportChannel(NetworkChannel.PositionUpdate, NetworkDelivery.UnreliableSequenced), - new TransportChannel(NetworkChannel.AnimationUpdate, NetworkDelivery.ReliableSequenced), - new TransportChannel(NetworkChannel.NavAgentState, NetworkDelivery.ReliableSequenced), - new TransportChannel(NetworkChannel.NavAgentCorrection, NetworkDelivery.UnreliableSequenced), - // todo: Currently, fragmentation support needed to deal with oversize packets encounterable with current pre-snapshot code". - // todo: once we have snapshotting able to deal with missing frame, this should be unreliable - new TransportChannel(NetworkChannel.NetworkVariable, NetworkDelivery.ReliableSequenced), - new TransportChannel(NetworkChannel.SnapshotExchange, NetworkDelivery.Unreliable), - new TransportChannel(NetworkChannel.Fragmented, NetworkDelivery.ReliableFragmentedSequenced), - - }; - /// /// Delegate for transport events. /// - public delegate void TransportEventDelegate(NetworkEvent type, ulong clientId, NetworkChannel networkChannel, ArraySegment payload, float receiveTime); + public delegate void TransportEventDelegate(NetworkEvent type, ulong clientId, ArraySegment payload, float receiveTime); /// /// Occurs when the transport has a new transport event. Can be used to make an event based transport instead of a poll based. @@ -125,12 +34,11 @@ public TransportChannel[] NETCODE_CHANNELS /// /// The event type /// The clientId this event is for - /// The channel the data arrived at. This is usually used when responding to things like RPCs /// The incoming data payload /// The time the event was received, as reported by Time.realtimeSinceStartup. - protected void InvokeOnTransportEvent(NetworkEvent type, ulong clientId, NetworkChannel networkChannel, ArraySegment payload, float receiveTime) + protected void InvokeOnTransportEvent(NetworkEvent type, ulong clientId, ArraySegment payload, float receiveTime) { - OnTransportEvent?.Invoke(type, clientId, networkChannel, payload, receiveTime); + OnTransportEvent?.Invoke(type, clientId, payload, receiveTime); } /// @@ -138,18 +46,17 @@ protected void InvokeOnTransportEvent(NetworkEvent type, ulong clientId, Network /// /// The clientId to send to /// The data to send - /// The channel to send data to - public abstract void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel); + /// The channel to send data to + public abstract void Send(ulong clientId, ArraySegment data, NetworkDelivery networkDelivery); /// /// Polls for incoming events, with an extra output parameter to report the precise time the event was received. /// /// The clientId this event is for - /// The channel the data arrived at. This is usually used when responding to things like RPCs /// The incoming data payload /// The time the event was received, as reported by Time.realtimeSinceStartup. /// Returns the event type - public abstract NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime); + public abstract NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime); /// /// Connects client to server @@ -189,4 +96,4 @@ protected void InvokeOnTransportEvent(NetworkEvent type, ulong clientId, Network /// public abstract void Init(); } -} +} \ No newline at end of file From 94177f8faa5419eeb091852de39f10b2e49f58da Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 16:58:57 +0100 Subject: [PATCH 02/14] polish NetworkTransport API --- .../Runtime/UTPTransport.cs | 2 +- .../Tests/Editor/BasicUTPTest.cs | 2 +- .../Runtime/Core/NetworkManager.cs | 2 +- .../Transports/MultiplexTransportAdapter.cs | 4 +- .../Runtime/Transports/NetworkTransport.cs | 37 ++++++++++--------- .../Runtime/Transports/UNET/UNetTransport.cs | 2 +- .../NetworkManagerMessageHandlerTests.cs | 2 +- .../Tests/Runtime/Transport/SIPTransport.cs | 2 +- .../Runtime/Transport/SIPTransportTests.cs | 4 +- 9 files changed, 29 insertions(+), 28 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 8dbf8d91d0..7c6feecb44 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -224,7 +224,7 @@ private NetworkConnection GetConnection(uint id) private NetworkPipeline[] m_NetworkPipelines = new NetworkPipeline[3]; - public override void Init() + public override void Initialize() { Driver = NetworkDriver.Create(); diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs b/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs index e2caac3363..d4c8af3e84 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs @@ -10,7 +10,7 @@ public void BasicUTPInitializationTest() { var o = new GameObject(); var utpTransport = (UTPTransport)o.AddComponent(typeof(UTPTransport)); - utpTransport.Init(); + utpTransport.Initialize(); Assert.True(utpTransport.ServerClientId == 0); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 89be713d52..68fa28ed7f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -643,7 +643,7 @@ private void Initialize(bool server) NetworkConfig.NetworkTransport.ResetChannelCache(); - NetworkConfig.NetworkTransport.Init(); + NetworkConfig.NetworkTransport.Initialize(); } /// diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs b/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs index ecf660b8ac..1c44cd0b79 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs @@ -73,13 +73,13 @@ public override ulong GetCurrentRtt(ulong clientId) return Transports[transportId].GetCurrentRtt(connectionId); } - public override void Init() + public override void Initialize() { for (int i = 0; i < Transports.Length; i++) { if (Transports[i].IsSupported) { - Transports[i].Init(); + Transports[i].Initialize(); } } } diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs index e3e5483ec9..c3d4a64809 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs @@ -6,48 +6,49 @@ namespace Unity.Netcode public abstract class NetworkTransport : MonoBehaviour { /// - /// A constant clientId that represents the server. - /// When this value is found in methods such as Send, it should be treated as a placeholder that means "the server" + /// A constant `clientId` that represents the server + /// When this value is found in methods such as `Send`, it should be treated as a placeholder that means "the server" /// public abstract ulong ServerClientId { get; } /// - /// Gets a value indicating whether this is supported in the current runtime context. - /// This is used by multiplex adapters. + /// Gets a value indicating whether this is supported in the current runtime context + /// This is used by multiplex adapters /// /// true if is supported; otherwise, false. public virtual bool IsSupported => true; /// - /// Delegate for transport events. + /// Delegate for transport network events /// - public delegate void TransportEventDelegate(NetworkEvent type, ulong clientId, ArraySegment payload, float receiveTime); + public delegate void TransportEventDelegate(NetworkEvent eventType, ulong clientId, ArraySegment payload, float receiveTime); /// - /// Occurs when the transport has a new transport event. Can be used to make an event based transport instead of a poll based. - /// Invokation has to occur on the Unity thread in the Update loop. + /// Occurs when the transport has a new transport network event. + /// Can be used to make an event based transport instead of a poll based. + /// Invocation has to occur on the Unity thread in the Update loop. /// public event TransportEventDelegate OnTransportEvent; /// /// Invokes the . Invokation has to occur on the Unity thread in the Update loop. /// - /// The event type + /// The event type /// The clientId this event is for /// The incoming data payload /// The time the event was received, as reported by Time.realtimeSinceStartup. - protected void InvokeOnTransportEvent(NetworkEvent type, ulong clientId, ArraySegment payload, float receiveTime) + protected void InvokeOnTransportEvent(NetworkEvent eventType, ulong clientId, ArraySegment payload, float receiveTime) { - OnTransportEvent?.Invoke(type, clientId, payload, receiveTime); + OnTransportEvent?.Invoke(eventType, clientId, payload, receiveTime); } /// /// Send a payload to the specified clientId, data and channelName. /// /// The clientId to send to - /// The data to send - /// The channel to send data to - public abstract void Send(ulong clientId, ArraySegment data, NetworkDelivery networkDelivery); + /// The data to send + /// The delivery type (QoS) to send data with + public abstract void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery); /// /// Polls for incoming events, with an extra output parameter to report the precise time the event was received. @@ -59,12 +60,12 @@ protected void InvokeOnTransportEvent(NetworkEvent type, ulong clientId, ArraySe public abstract NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime); /// - /// Connects client to server + /// Connects client to the server /// public abstract SocketTasks StartClient(); /// - /// Starts to listen for incoming clients. + /// Starts to listening for incoming clients /// public abstract SocketTasks StartServer(); @@ -82,7 +83,7 @@ protected void InvokeOnTransportEvent(NetworkEvent type, ulong clientId, ArraySe /// /// Gets the round trip time for a specific client. This method is optional /// - /// The clientId to get the rtt from + /// The clientId to get the RTT from /// Returns the round trip time in milliseconds public abstract ulong GetCurrentRtt(ulong clientId); @@ -94,6 +95,6 @@ protected void InvokeOnTransportEvent(NetworkEvent type, ulong clientId, ArraySe /// /// Initializes the transport /// - public abstract void Init(); + public abstract void Initialize(); } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs index b93d9b3abe..ddf160a838 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs @@ -312,7 +312,7 @@ public override void Shutdown() UnityEngine.Networking.NetworkTransport.Shutdown(); } - public override void Init() + public override void Initialize() { m_MessageBuffer = new byte[MessageBufferSize]; diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs index 2b01929ccc..52f779745b 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs @@ -252,7 +252,7 @@ public override void Shutdown() { } - public override void Init() + public override void Initialize() { } } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs index 76f50d0596..1dfb3d6ae8 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs @@ -108,7 +108,7 @@ public override ulong GetCurrentRtt(ulong clientId) return 50; } - public override void Init() + public override void Initialize() { } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransportTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransportTests.cs index 6d5f3246d0..bc507294c9 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransportTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransportTests.cs @@ -13,10 +13,10 @@ public void SendReceiveData() SIPTransport server = new GameObject("Server").AddComponent(); SIPTransport client = new GameObject("Client").AddComponent(); - server.Init(); + server.Initialize(); server.StartServer(); - client.Init(); + client.Initialize(); client.StartClient(); NetworkEvent serverEvent = server.PollEvent(out ulong clientId, out NetworkChannel _, out _, out _); From 8e213841a3cd834227ab0676e552eb12a7751d1a Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 17:47:22 +0100 Subject: [PATCH 03/14] port UNetTransport --- .../Runtime/Transports/UNET/UNetTransport.cs | 202 +++++------------- 1 file changed, 55 insertions(+), 147 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs index ddf160a838..aa5831cc5a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs @@ -1,7 +1,6 @@ #pragma warning disable 618 // disable is obsolete #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System; -using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; @@ -15,6 +14,12 @@ public enum SendMode Queued } + private int m_UnreliableChannelId; + private int m_UnreliableSequencedChannelId; + private int m_ReliableChannelId; + private int m_ReliableSequencedChannelId; + private int m_ReliableFragmentedSequencedChannelId; + // Inspector / settings public int MessageBufferSize = 1024 * 5; public int MaxConnections = 100; @@ -24,18 +29,6 @@ public enum SendMode public int ConnectPort = 7777; public int ServerListenPort = 7777; - // user-definable channels. To add your own channel, do something of the form: - // #define MY_CHANNEL 0 - // ... - // transport.Channels.Add( - // new UNetChannel() - // { - // Id = Channel.ChannelUnused + MY_CHANNEL, <<-- must offset from reserved channel offset in netcode SDK - // Type = QosType.Unreliable - // } - // ); - public List Channels = new List(); - public SendMode MessageSendMode = SendMode.Immediately; // Runtime / state @@ -43,25 +36,12 @@ public enum SendMode private WeakReference m_TemporaryBufferReference; // Lookup / translation - private readonly Dictionary m_ChannelNameToId = new Dictionary(); - private readonly Dictionary m_ChannelIdToName = new Dictionary(); private int m_ServerConnectionId; private int m_ServerHostId; private SocketTask m_ConnectTask; public override ulong ServerClientId => GetNetcodeClientId(0, 0, true); -#if UNITY_EDITOR - private void OnValidate() - { - for (int i = 0; i < Channels.Count; i++) - { - // Set the channels to a incrementing value - Channels[i].Id = (byte)((byte)NetworkChannel.ChannelUnused + i); - } - } -#endif - protected void LateUpdate() { if (UnityEngine.Networking.NetworkTransport.IsStarted && MessageSendMode == SendMode.Queued) @@ -71,9 +51,9 @@ protected void LateUpdate() #else if (NetworkManager.Singleton.IsServer) { - for (int i = 0; i < NetworkManager.Singleton.ConnectedClientsList.Count; i++) + foreach (var targetClient in NetworkManager.Singleton.ConnectedClientsList) { - SendQueued(NetworkManager.Singleton.ConnectedClientsList[i].ClientId); + SendQueued(targetClient.ClientId); } } else @@ -84,50 +64,58 @@ protected void LateUpdate() } } - public override void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) + public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) { GetUNetConnectionDetails(clientId, out byte hostId, out ushort connectionId); - int channelId = 0; - - if (m_ChannelNameToId.TryGetValue(networkChannel, out int value)) - { - channelId = value; - } - else - { - channelId = m_ChannelNameToId[NetworkChannel.Internal]; - } - byte[] buffer; - - if (data.Offset > 0) + if (payload.Offset > 0) { // UNET cant handle this, do a copy - if (m_MessageBuffer.Length >= data.Count) + if (m_MessageBuffer.Length >= payload.Count) { buffer = m_MessageBuffer; } else { - object bufferRef = null; - if (m_TemporaryBufferReference != null && ((bufferRef = m_TemporaryBufferReference.Target) != null) && ((byte[])bufferRef).Length >= data.Count) + object bufferRef; + if (m_TemporaryBufferReference != null && ((bufferRef = m_TemporaryBufferReference.Target) != null) && ((byte[])bufferRef).Length >= payload.Count) { buffer = (byte[])bufferRef; } else { - buffer = new byte[data.Count]; + buffer = new byte[payload.Count]; m_TemporaryBufferReference = new WeakReference(buffer); } } - Buffer.BlockCopy(data.Array, data.Offset, buffer, 0, data.Count); + Buffer.BlockCopy(payload.Array, payload.Offset, buffer, 0, payload.Count); } else { - buffer = data.Array; + buffer = payload.Array; + } + + int channelId = -1; + switch (networkDelivery) + { + case NetworkDelivery.Unreliable: + channelId = m_UnreliableChannelId; + break; + case NetworkDelivery.UnreliableSequenced: + channelId = m_UnreliableSequencedChannelId; + break; + case NetworkDelivery.Reliable: + channelId = m_ReliableChannelId; + break; + case NetworkDelivery.ReliableSequenced: + channelId = m_ReliableSequencedChannelId; + break; + case NetworkDelivery.ReliableFragmentedSequenced: + channelId = m_ReliableFragmentedSequencedChannelId; + break; } if (MessageSendMode == SendMode.Queued) @@ -135,27 +123,27 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne #if UNITY_WEBGL Debug.LogError("Cannot use queued sending mode for WebGL"); #else - UnityEngine.Networking.NetworkTransport.QueueMessageForSending(hostId, connectionId, channelId, buffer, data.Count, out byte error); + UnityEngine.Networking.NetworkTransport.QueueMessageForSending(hostId, connectionId, channelId, buffer, payload.Count, out byte error); #endif } else { - UnityEngine.Networking.NetworkTransport.Send(hostId, connectionId, channelId, buffer, data.Count, out byte error); + UnityEngine.Networking.NetworkTransport.Send(hostId, connectionId, channelId, buffer, payload.Count, out byte error); } } #if !UNITY_WEBGL - public void SendQueued(ulong clientId) + private void SendQueued(ulong clientId) { GetUNetConnectionDetails(clientId, out byte hostId, out ushort connectionId); - UnityEngine.Networking.NetworkTransport.SendQueuedMessages(hostId, connectionId, out byte error); + UnityEngine.Networking.NetworkTransport.SendQueuedMessages(hostId, connectionId, out _); } #endif - public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) + public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) { - var eventType = UnityEngine.Networking.NetworkTransport.Receive(out int hostId, out int connectionId, out int channelId, m_MessageBuffer, m_MessageBuffer.Length, out int receivedSize, out byte error); + var eventType = UnityEngine.Networking.NetworkTransport.Receive(out int hostId, out int connectionId, out _, m_MessageBuffer, m_MessageBuffer.Length, out int receivedSize, out byte error); clientId = GetNetcodeClientId((byte)hostId, (ushort)connectionId, false); receiveTime = Time.realtimeSinceStartup; @@ -175,7 +163,7 @@ public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel ne m_TemporaryBufferReference = new WeakReference(tempBuffer); } - eventType = UnityEngine.Networking.NetworkTransport.Receive(out hostId, out connectionId, out channelId, tempBuffer, tempBuffer.Length, out receivedSize, out error); + eventType = UnityEngine.Networking.NetworkTransport.Receive(out hostId, out connectionId, out _, tempBuffer, tempBuffer.Length, out receivedSize, out error); payload = new ArraySegment(tempBuffer, 0, receivedSize); } else @@ -183,15 +171,6 @@ public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel ne payload = new ArraySegment(m_MessageBuffer, 0, receivedSize); } - if (m_ChannelIdToName.TryGetValue(channelId, out NetworkChannel value)) - { - networkChannel = value; - } - else - { - networkChannel = NetworkChannel.Internal; - } - if (m_ConnectTask != null && hostId == m_ServerHostId && connectionId == m_ServerConnectionId) { if (eventType == NetworkEventType.ConnectEvent) @@ -281,7 +260,7 @@ public override SocketTasks StartServer() { var topology = new HostTopology(GetConfig(), MaxConnections); - int normalHostId = UnityEngine.Networking.NetworkTransport.AddHost(topology, ServerListenPort, null); + UnityEngine.Networking.NetworkTransport.AddHost(topology, ServerListenPort, null); return SocketTask.Done.AsTasks(); } @@ -307,8 +286,6 @@ public override ulong GetCurrentRtt(ulong clientId) public override void Shutdown() { - m_ChannelIdToName.Clear(); - m_ChannelNameToId.Clear(); UnityEngine.Networking.NetworkTransport.Shutdown(); } @@ -319,19 +296,17 @@ public override void Initialize() UnityEngine.Networking.NetworkTransport.Init(); } - public ulong GetNetcodeClientId(byte hostId, ushort connectionId, bool isServer) + private ulong GetNetcodeClientId(byte hostId, ushort connectionId, bool isServer) { if (isServer) { return 0; } - else - { - return ((ulong)connectionId | (ulong)hostId << 16) + 1; - } + + return (connectionId | (ulong)hostId << 16) + 1; } - public void GetUNetConnectionDetails(ulong clientId, out byte hostId, out ushort connectionId) + private void GetUNetConnectionDetails(ulong clientId, out byte hostId, out ushort connectionId) { if (clientId == 0) { @@ -345,88 +320,21 @@ public void GetUNetConnectionDetails(ulong clientId, out byte hostId, out ushort } } - public ConnectionConfig GetConfig() + private ConnectionConfig GetConfig() { var connectionConfig = new ConnectionConfig(); - // Built-in netcode channels - for (int i = 0; i < NETCODE_CHANNELS.Length; i++) - { - int channelId = AddNetcodeChannel(NETCODE_CHANNELS[i].Delivery, connectionConfig); - - m_ChannelIdToName.Add(channelId, NETCODE_CHANNELS[i].Channel); - m_ChannelNameToId.Add(NETCODE_CHANNELS[i].Channel, channelId); - } - - // Custom user-added channels - for (int i = 0; i < Channels.Count; i++) - { - int channelId = AddUNETChannel(Channels[i].Type, connectionConfig); - - if (m_ChannelNameToId.ContainsKey((NetworkChannel)Channels[i].Id)) - { - throw new InvalidChannelException($"Channel {channelId} already exists"); - } - - m_ChannelIdToName.Add(channelId, (NetworkChannel)Channels[i].Id); - m_ChannelNameToId.Add((NetworkChannel)Channels[i].Id, channelId); - } + m_UnreliableChannelId = connectionConfig.AddChannel(QosType.Unreliable); + m_UnreliableSequencedChannelId = connectionConfig.AddChannel(QosType.UnreliableSequenced); + m_ReliableChannelId = connectionConfig.AddChannel(QosType.Reliable); + m_ReliableSequencedChannelId = connectionConfig.AddChannel(QosType.ReliableSequenced); + m_ReliableFragmentedSequencedChannelId = connectionConfig.AddChannel(QosType.ReliableFragmentedSequenced); connectionConfig.MaxSentMessageQueueSize = (ushort)MaxSentMessageQueueSize; return connectionConfig; } - - public int AddNetcodeChannel(NetworkDelivery type, ConnectionConfig config) - { - switch (type) - { - case NetworkDelivery.Unreliable: - return config.AddChannel(QosType.Unreliable); - case NetworkDelivery.Reliable: - return config.AddChannel(QosType.Reliable); - case NetworkDelivery.ReliableSequenced: - return config.AddChannel(QosType.ReliableSequenced); - case NetworkDelivery.ReliableFragmentedSequenced: - return config.AddChannel(QosType.ReliableFragmentedSequenced); - case NetworkDelivery.UnreliableSequenced: - return config.AddChannel(QosType.UnreliableSequenced); - } - - return 0; - } - - public int AddUNETChannel(QosType type, ConnectionConfig config) - { - switch (type) - { - case QosType.Unreliable: - return config.AddChannel(QosType.Unreliable); - case QosType.UnreliableFragmented: - return config.AddChannel(QosType.UnreliableFragmented); - case QosType.UnreliableSequenced: - return config.AddChannel(QosType.UnreliableSequenced); - case QosType.Reliable: - return config.AddChannel(QosType.Reliable); - case QosType.ReliableFragmented: - return config.AddChannel(QosType.ReliableFragmented); - case QosType.ReliableSequenced: - return config.AddChannel(QosType.ReliableSequenced); - case QosType.StateUpdate: - return config.AddChannel(QosType.StateUpdate); - case QosType.ReliableStateUpdate: - return config.AddChannel(QosType.ReliableStateUpdate); - case QosType.AllCostDelivery: - return config.AddChannel(QosType.AllCostDelivery); - case QosType.UnreliableFragmentedSequenced: - return config.AddChannel(QosType.UnreliableFragmentedSequenced); - case QosType.ReliableFragmentedSequenced: - return config.AddChannel(QosType.ReliableFragmentedSequenced); - } - - return 0; - } } } #pragma warning restore CS1591 // Missing XML comment for publicly visible type or member -#pragma warning restore 618 // restore is obsolete +#pragma warning restore 618 // restore is obsolete \ No newline at end of file From 90eecc5ca3c7478cfcab5e2fa429f39a1e1c0f58 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 18:03:57 +0100 Subject: [PATCH 04/14] kill MultiplexTransportAdapter --- .../Transports/MultiplexTransportAdapter.cs | 329 ------------------ .../MultiplexTransportAdapter.cs.meta | 11 - 2 files changed, 340 deletions(-) delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs b/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs deleted file mode 100644 index 1c44cd0b79..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs +++ /dev/null @@ -1,329 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Unity.Netcode -{ - /// - /// Multiplex transport adapter. - /// - public class MultiplexTransportAdapter : NetworkTransport - { - /// - /// The method to use to distribute the transport connectionIds in a fixed size 64 bit integer. - /// - public enum ConnectionIdSpreadMethod - { - /// - /// Drops the first few bits (left side) by shifting the transport clientId to the left and inserting the transportId in the first bits. - /// Ensure that ALL transports dont use the last bits in their produced clientId. - /// For incremental clientIds, this is the most space efficient assuming that every transport get used an equal amount. - /// - MakeRoomLastBits, - - /// - /// Drops the first few bits (left side) and replaces them with the transport index. - /// Ensure that ALL transports dont use the first few bits in the produced clientId. - /// - ReplaceFirstBits, - - /// - /// Drops the last few bits (right side) and replaces them with the transport index. - /// Ensure that ALL transports dont use the last bits in their produced clientId. - /// This option is for advanced users and will not work with the official netcode transports as they use the last bits. - /// - ReplaceLastBits, - - /// - /// Drops the last few bits (right side) by shifting the transport clientId to the right and inserting the transportId in the first bits. - /// Ensure that ALL transports dont use the first bits in their produced clientId. - /// - MakeRoomFirstBits, - - /// - /// Spreads the clientIds evenly among the transports. - /// - Spread - } - -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - public ConnectionIdSpreadMethod SpreadMethod = ConnectionIdSpreadMethod.MakeRoomLastBits; - public NetworkTransport[] Transports = new NetworkTransport[0]; - public override ulong ServerClientId => 0; - - private byte m_LastProcessedTransportIndex; - - public override bool IsSupported => true; - - public override void DisconnectLocalClient() - { - Transports[GetFirstSupportedTransportIndex()].DisconnectLocalClient(); - } - - public override void DisconnectRemoteClient(ulong clientId) - { - GetMultiplexTransportDetails(clientId, out byte transportId, out ulong connectionId); - - Transports[transportId].DisconnectRemoteClient(connectionId); - } - - public override ulong GetCurrentRtt(ulong clientId) - { - GetMultiplexTransportDetails(clientId, out byte transportId, out ulong connectionId); - - return Transports[transportId].GetCurrentRtt(connectionId); - } - - public override void Initialize() - { - for (int i = 0; i < Transports.Length; i++) - { - if (Transports[i].IsSupported) - { - Transports[i].Initialize(); - } - } - } - - public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) - { - if (m_LastProcessedTransportIndex >= Transports.Length - 1) - { - m_LastProcessedTransportIndex = 0; - } - - for (byte i = m_LastProcessedTransportIndex; i < Transports.Length; i++) - { - m_LastProcessedTransportIndex = i; - - if (Transports[i].IsSupported) - { - var networkEvent = Transports[i].PollEvent(out ulong connectionId, out networkChannel, out payload, out receiveTime); - - if (networkEvent != NetworkEvent.Nothing) - { - clientId = GetNetcodeClientId(i, connectionId, false); - - return networkEvent; - } - } - } - - clientId = 0; - networkChannel = 0; - payload = new ArraySegment(); - receiveTime = 0; - - return NetworkEvent.Nothing; - } - - public override void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) - { - GetMultiplexTransportDetails(clientId, out byte transportId, out ulong connectionId); - - Transports[transportId].Send(connectionId, data, networkChannel); - } - - public override void Shutdown() - { - for (int i = 0; i < Transports.Length; i++) - { - if (Transports[i].IsSupported) - { - Transports[i].Shutdown(); - } - } - } - - public override SocketTasks StartClient() - { - var socketTasks = new List(); - - for (int i = 0; i < Transports.Length; i++) - { - if (Transports[i].IsSupported) - { - socketTasks.AddRange(Transports[i].StartClient().Tasks); - } - } - - return new SocketTasks { Tasks = socketTasks.ToArray() }; - } - - public override SocketTasks StartServer() - { - var socketTasks = new List(); - - for (int i = 0; i < Transports.Length; i++) - { - if (Transports[i].IsSupported) - { - socketTasks.AddRange(Transports[i].StartServer().Tasks); - } - } - - return new SocketTasks { Tasks = socketTasks.ToArray() }; - } - - - public ulong GetNetcodeClientId(byte transportId, ulong connectionId, bool isServer) - { - if (isServer) - { - return ServerClientId; - } - - switch (SpreadMethod) - { - case ConnectionIdSpreadMethod.ReplaceFirstBits: - { - // Calculate bits to store transportId - byte bits = (byte)UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Log(Transports.Length, 2)); - - // Drop first bits of connectionId - ulong clientId = ((connectionId << bits) >> bits); - - // Place transportId there - ulong shiftedTransportId = (ulong)transportId << ((sizeof(ulong) * 8) - bits); - - return (clientId | shiftedTransportId) + 1; - } - case ConnectionIdSpreadMethod.MakeRoomFirstBits: - { - // Calculate bits to store transportId - byte bits = (byte)UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Log(Transports.Length, 2)); - - // Drop first bits of connectionId - ulong clientId = (connectionId >> bits); - - // Place transportId there - ulong shiftedTransportId = (ulong)transportId << ((sizeof(ulong) * 8) - bits); - - return (clientId | shiftedTransportId) + 1; - } - case ConnectionIdSpreadMethod.ReplaceLastBits: - { - // Calculate bits to store transportId - byte bits = (byte)UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Log(Transports.Length, 2)); - - // Drop the last bits of connectionId - ulong clientId = ((connectionId >> bits) << bits); - - // Return the transport inserted at the end - return (clientId | transportId) + 1; - } - case ConnectionIdSpreadMethod.MakeRoomLastBits: - { - // Calculate bits to store transportId - byte bits = (byte)UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Log(Transports.Length, 2)); - - // Drop the last bits of connectionId - ulong clientId = (connectionId << bits); - - // Return the transport inserted at the end - return (clientId | transportId) + 1; - } - case ConnectionIdSpreadMethod.Spread: - { - return (connectionId * (ulong)Transports.Length + (ulong)transportId) + 1; - } - default: - { - return ServerClientId; - } - } - } - - public void GetMultiplexTransportDetails(ulong clientId, out byte transportId, out ulong connectionId) - { - if (clientId == ServerClientId) - { - transportId = GetFirstSupportedTransportIndex(); - connectionId = Transports[transportId].ServerClientId; - } - else - { - switch (SpreadMethod) - { - case ConnectionIdSpreadMethod.ReplaceFirstBits: - { - // The first clientId is reserved. Thus every clientId is always offset by 1 - clientId--; - - // Calculate bits to store transportId - byte bits = (byte)UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Log(Transports.Length, 2)); - - transportId = (byte)(clientId >> ((sizeof(ulong) * 8) - bits)); - connectionId = ((clientId << bits) >> bits); - break; - } - case ConnectionIdSpreadMethod.MakeRoomFirstBits: - { - // The first clientId is reserved. Thus every clientId is always offset by 1 - clientId--; - - // Calculate bits to store transportId - byte bits = (byte)UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Log(Transports.Length, 2)); - - transportId = (byte)(clientId >> ((sizeof(ulong) * 8) - bits)); - connectionId = (clientId << bits); - break; - } - case ConnectionIdSpreadMethod.ReplaceLastBits: - { - // The first clientId is reserved. Thus every clientId is always offset by 1 - clientId--; - - // Calculate bits to store transportId - byte bits = (byte)UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Log(Transports.Length, 2)); - - transportId = (byte)((clientId << ((sizeof(ulong) * 8) - bits)) >> ((sizeof(ulong) * 8) - bits)); - connectionId = ((clientId >> bits) << bits); - break; - } - case ConnectionIdSpreadMethod.MakeRoomLastBits: - { - // The first clientId is reserved. Thus every clientId is always offset by 1 - clientId--; - - // Calculate bits to store transportId - byte bits = (byte)UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Log(Transports.Length, 2)); - - transportId = (byte)((clientId << ((sizeof(ulong) * 8) - bits)) >> ((sizeof(ulong) * 8) - bits)); - connectionId = (clientId >> bits); - break; - } - case ConnectionIdSpreadMethod.Spread: - { - // The first clientId is reserved. Thus every clientId is always offset by 1 - clientId--; - - transportId = (byte)(clientId % (ulong)Transports.Length); - connectionId = (clientId / (ulong)Transports.Length); - break; - } - default: - { - transportId = GetFirstSupportedTransportIndex(); - connectionId = Transports[transportId].ServerClientId; - break; - } - } - } - } - - public byte GetFirstSupportedTransportIndex() - { - for (byte i = 0; i < Transports.Length; i++) - { - if (Transports[i].IsSupported) - { - return i; - } - } - - return 0; - } - -#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member - } -} diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs.meta b/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs.meta deleted file mode 100644 index f091aac9e7..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/MultiplexTransportAdapter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: adf0b801ebdee8c4b838e20292b36ac4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 411cd5c827ee2dd5d6a618ae46fa250a8bbd9ccc Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 18:04:33 +0100 Subject: [PATCH 05/14] kill TransportChannel --- .../Runtime/Transports/TransportChannel.cs | 27 ------------------- .../Transports/TransportChannel.cs.meta | 11 -------- 2 files changed, 38 deletions(-) delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/TransportChannel.cs delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/TransportChannel.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/TransportChannel.cs b/com.unity.netcode.gameobjects/Runtime/Transports/TransportChannel.cs deleted file mode 100644 index af35804a93..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/TransportChannel.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; - -namespace Unity.Netcode -{ - /// - /// A transport channel used by the netcode - /// - [Serializable] - public struct TransportChannel - { - public TransportChannel(NetworkChannel channel, NetworkDelivery delivery) - { - Channel = channel; - Delivery = delivery; - } - - /// - /// Channel identifier - /// - public NetworkChannel Channel; - - /// - /// Delivery type - /// - public NetworkDelivery Delivery; - } -} diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/TransportChannel.cs.meta b/com.unity.netcode.gameobjects/Runtime/Transports/TransportChannel.cs.meta deleted file mode 100644 index 35694a33ab..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/TransportChannel.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a7bc986a2f8f5584988f87dbf35965fe -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From a2a95f8142e15ec154e5c095f7a5892e87ba07b9 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 18:13:21 +0100 Subject: [PATCH 06/14] NetworkVariableChannel -> Delivery --- .../Runtime/Core/NetworkBehaviour.cs | 2 +- .../Runtime/NetworkVariable/NetworkVariableBase.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs index e7a64afee9..fe97714120 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs @@ -442,7 +442,7 @@ internal void InitializeVariables() for (int i = 0; i < NetworkVariableFields.Count; i++) { - var networkChannel = NetworkVariableBase.NetworkVariableChannel; + var networkChannel = NetworkVariableBase.Delivery; if (!firstLevelIndex.ContainsKey(networkChannel)) { diff --git a/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs b/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs index 16f0257dc7..7c965a33ff 100644 --- a/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs +++ b/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs @@ -14,9 +14,9 @@ public void Initialize(NetworkBehaviour networkBehaviour) m_NetworkBehaviour = networkBehaviour; } /// - /// The name of the channel to be used for syncing + /// The delivery type (QoS) to send data with /// - public const NetworkChannel NetworkVariableChannel = NetworkChannel.NetworkVariable; + public NetworkDelivery Delivery = NetworkDelivery.ReliableSequenced; protected NetworkVariableBase(NetworkVariableReadPermission readPermIn = NetworkVariableReadPermission.Everyone) { From d0ef70c1860574d6e83173c149d17c097142462b Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 18:15:08 +0100 Subject: [PATCH 07/14] update IInternalMessageHandler interface --- .../Runtime/Messaging/IInternalMessageHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/IInternalMessageHandler.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/IInternalMessageHandler.cs index c345ffc3a3..ad3ea71954 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/IInternalMessageHandler.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/IInternalMessageHandler.cs @@ -13,7 +13,7 @@ internal interface IInternalMessageHandler void HandleChangeOwner(ulong clientId, Stream stream); void HandleTimeSync(ulong clientId, Stream stream); void HandleNetworkVariableDelta(ulong clientId, Stream stream); - void MessageReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, MessageQueueContainer.MessageType messageType, NetworkChannel receiveChannel); + void MessageReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, MessageQueueContainer.MessageType messageType); void HandleUnnamedMessage(ulong clientId, Stream stream); void HandleNamedMessage(ulong clientId, Stream stream); void HandleNetworkLog(ulong clientId, Stream stream); From b52c541cfbf5c7a7825c408c6a7e4bfb514fde34 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 19:19:59 +0100 Subject: [PATCH 08/14] kill NetworkChannel around the codebase --- .../Runtime/UTPTransport.cs | 33 +++----- .../Runtime/Core/NetworkBehaviour.cs | 45 +++++----- .../Runtime/Core/NetworkManager.cs | 83 +++++++------------ .../Runtime/Core/NetworkObject.cs | 10 +-- .../Runtime/Core/SnapshotSystem.cs | 6 +- .../Runtime/Logging/NetworkLog.cs | 4 +- .../Runtime/Messaging/CustomMessageManager.cs | 76 ++++++++--------- .../Messaging/InternalMessageHandler.cs | 7 +- .../Runtime/Messaging/MessageBatcher.cs | 26 +++--- .../MessageQueue/MessageFrameItem.cs | 2 +- .../MessageQueue/MessageQueueContainer.cs | 67 ++++++--------- .../MessageQueue/MessageQueueHistoryFrame.cs | 5 +- .../MessageQueue/MessageQueueProcessor.cs | 12 +-- ...nternalMessageHandlerProfilingDecorator.cs | 4 +- .../SceneManagement/NetworkSceneManager.cs | 20 ++--- .../Runtime/Spawning/NetworkSpawnManager.cs | 17 +--- .../Runtime/Transports/Tests.meta | 8 -- .../Runtime/Transports/Tests/Editor.meta | 8 -- .../Transports/Tests/Editor/TransportTest.cs | 70 ---------------- .../Tests/Editor/TransportTest.cs.meta | 11 --- ....unity.netcode.transport.editortest.asmdef | 12 --- ...y.netcode.transport.editortest.asmdef.meta | 7 -- .../Tests/Editor/DummyMessageHandler.cs | 10 +-- .../Tests/Editor/MessageBatcherTests.cs | 8 +- .../NetworkManagerMessageHandlerTests.cs | 49 ++++++----- ...alMessageHandlerProfilingDecoratorTests.cs | 2 +- .../Tests/Runtime/RpcQueueTests.cs | 34 +++----- .../Tests/Runtime/Transport/SIPTransport.cs | 33 +++----- .../Runtime/Transport/SIPTransportTests.cs | 14 ++-- 29 files changed, 229 insertions(+), 454 deletions(-) delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Tests.meta delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor.meta delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs.meta delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/com.unity.netcode.transport.editortest.asmdef delete mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/com.unity.netcode.transport.editortest.asmdef.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 7c6feecb44..e3e23df0fe 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -1,17 +1,13 @@ using System; using System.Runtime.InteropServices; - using Unity.Netcode; - using Unity.Burst; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using Unity.Jobs; using Unity.Networking.Transport; - using UnityEngine; using UnityEngine.Assertions; - using NetworkEvent = Unity.Networking.Transport.NetworkEvent; using NetcodeEvent = Unity.Netcode.NetworkEvent; @@ -40,14 +36,12 @@ unsafe public void Execute() return; } - DataStreamReader streamReader; NetworkEvent.Type cmd; - - while ((cmd = Connection[0].PopEvent(Driver, out streamReader)) != NetworkEvent.Type.Empty) + while ((cmd = Connection[0].PopEvent(Driver, out var streamReader)) != NetworkEvent.Type.Empty) { if (cmd == NetworkEvent.Type.Connect) { - var d = new RawNetworkMessage() { Length = 0, Type = (uint)NetcodeEvent.Connect, Id = Connection[0].InternalId }; + var d = new RawNetworkMessage { Length = 0, Type = (uint)NetcodeEvent.Connect, Id = Connection[0].InternalId }; PacketData.Enqueue(d); } else if (cmd == NetworkEvent.Type.Data) @@ -260,14 +254,14 @@ public void SendToClient(NativeArray packet, ulong clientId, int index) } } - public override unsafe void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) + public override unsafe void Send(ulong clientId, ArraySegment data, NetworkDelivery networkDelivery) { var pipelineIndex = 0; GetUTPConnectionDetails(clientId, out uint peerId); var writer = new DataStreamWriter(data.Count + 1 + 4, Allocator.Temp); - writer.WriteByte((byte)networkChannel); + writer.WriteByte((byte)networkDelivery); writer.WriteInt(data.Count); fixed (byte* dataArrayPtr = data.Array) @@ -278,10 +272,9 @@ public override unsafe void Send(ulong clientId, ArraySegment data, Networ SendToClient(writer.AsNativeArray(), peerId, pipelineIndex); } - public override NetcodeEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) + public override NetcodeEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) { clientId = 0; - networkChannel = NetworkChannel.ChannelUnused; payload = new ArraySegment(Array.Empty()); receiveTime = 0; @@ -315,20 +308,20 @@ private void Update() { Marshal.Copy((IntPtr)message.Data, arr, 0, size); var payload = new ArraySegment(arr); - InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, (NetworkChannel)message.ChannelId, payload, Time.realtimeSinceStartup); + InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, payload, Time.realtimeSinceStartup); } break; case NetcodeEvent.Connect: - { - InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, NetworkChannel.ChannelUnused, new ArraySegment(), Time.realtimeSinceStartup); - } + { + InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, new ArraySegment(), Time.realtimeSinceStartup); + } break; case NetcodeEvent.Disconnect: - InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, NetworkChannel.ChannelUnused, new ArraySegment(), Time.realtimeSinceStartup); + InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, new ArraySegment(), Time.realtimeSinceStartup); break; case NetcodeEvent.Nothing: - InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, NetworkChannel.ChannelUnused, new ArraySegment(), Time.realtimeSinceStartup); + InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, new ArraySegment(), Time.realtimeSinceStartup); break; } } @@ -336,7 +329,6 @@ private void Update() if (m_JobHandle.IsCompleted) { - if (m_IsServer) { var connectionJob = new ServerUpdateConnectionsJob @@ -344,7 +336,6 @@ private void Update() Driver = Driver, Connections = Connections, PacketData = PacketData.AsParallelWriter() - }; var serverUpdateJob = new ServerUpdateJob @@ -464,4 +455,4 @@ public override SocketTasks StartServer() return SocketTask.Working.AsTasks(); } -} +} \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs index fe97714120..3ed2e6ef1e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs @@ -64,16 +64,16 @@ internal NetworkSerializer __beginSendServerRpc(uint rpcMethodId, ServerRpcParam } var messageQueueContainer = NetworkManager.MessageQueueContainer; - var transportChannel = rpcDelivery == RpcDelivery.Reliable ? NetworkChannel.ReliableRpc : NetworkChannel.UnreliableRpc; + var networkDelivery = rpcDelivery == RpcDelivery.Reliable ? NetworkDelivery.ReliableSequenced : NetworkDelivery.UnreliableSequenced; if (IsHost) { - writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ServerRpc, Time.realtimeSinceStartup, transportChannel, + writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ServerRpc, Time.realtimeSinceStartup, networkDelivery, NetworkManager.ServerClientId, null, MessageQueueHistoryFrame.QueueFrameType.Inbound, serverRpcParams.Send.UpdateStage); } else { - writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ServerRpc, Time.realtimeSinceStartup, transportChannel, + writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ServerRpc, Time.realtimeSinceStartup, networkDelivery, NetworkManager.ServerClientId, null, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); writer.WriteByte((byte)MessageQueueContainer.MessageType.ServerRpc); @@ -133,7 +133,7 @@ internal NetworkSerializer __beginSendClientRpc(uint rpcMethodId, ClientRpcParam } // This will start a new queue item entry and will then return the writer to the current frame's stream - var transportChannel = rpcDelivery == RpcDelivery.Reliable ? NetworkChannel.ReliableRpc : NetworkChannel.UnreliableRpc; + var networkDelivery = rpcDelivery == RpcDelivery.Reliable ? NetworkDelivery.ReliableSequenced : NetworkDelivery.UnreliableSequenced; ulong[] clientIds = clientRpcParams.Send.TargetClientIds ?? NetworkManager.ConnectedClientsIds; if (clientRpcParams.Send.TargetClientIds != null && clientRpcParams.Send.TargetClientIds.Length == 0) @@ -151,7 +151,7 @@ internal NetworkSerializer __beginSendClientRpc(uint rpcMethodId, ClientRpcParam if (IsHost && containsServerClientId) { //Always write to the next frame's inbound queue - writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ClientRpc, Time.realtimeSinceStartup, transportChannel, + writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ClientRpc, Time.realtimeSinceStartup, networkDelivery, NetworkManager.ServerClientId, null, MessageQueueHistoryFrame.QueueFrameType.Inbound, clientRpcParams.Send.UpdateStage); //Handle sending to the other clients, if so the above notes explain why this code is here (a temporary patch-fix) @@ -161,7 +161,7 @@ internal NetworkSerializer __beginSendClientRpc(uint rpcMethodId, ClientRpcParam messageQueueContainer.SetLoopBackFrameItem(clientRpcParams.Send.UpdateStage); //Switch to the outbound queue - writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ClientRpc, Time.realtimeSinceStartup, transportChannel, NetworkObjectId, + writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ClientRpc, Time.realtimeSinceStartup, networkDelivery, NetworkObjectId, clientIds, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); } else @@ -171,7 +171,7 @@ internal NetworkSerializer __beginSendClientRpc(uint rpcMethodId, ClientRpcParam } else { - writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ClientRpc, Time.realtimeSinceStartup, transportChannel, NetworkObjectId, + writer = messageQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ClientRpc, Time.realtimeSinceStartup, networkDelivery, NetworkObjectId, clientIds, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); } @@ -364,8 +364,8 @@ public virtual void OnNetworkObjectParentChanged(NetworkObject parentNetworkObje private bool m_VarInit = false; - private readonly List> m_ChannelMappedNetworkVariableIndexes = new List>(); - private readonly List m_ChannelsForNetworkVariableGroups = new List(); + private readonly List> m_DeliveryMappedNetworkVariableIndices = new List>(); + private readonly List m_DeliveryTypesForNetworkVariableGroups = new List(); internal readonly List NetworkVariableFields = new List(); private static Dictionary s_FieldTypes = new Dictionary(); @@ -436,27 +436,26 @@ internal void InitializeVariables() } { - // Create index map for channels - var firstLevelIndex = new Dictionary(); + // Create index map for delivery types + var firstLevelIndex = new Dictionary(); int secondLevelCounter = 0; for (int i = 0; i < NetworkVariableFields.Count; i++) { - var networkChannel = NetworkVariableBase.Delivery; - - if (!firstLevelIndex.ContainsKey(networkChannel)) + var networkDelivery = NetworkVariableFields[i].Delivery; + if (!firstLevelIndex.ContainsKey(networkDelivery)) { - firstLevelIndex.Add(networkChannel, secondLevelCounter); - m_ChannelsForNetworkVariableGroups.Add(networkChannel); + firstLevelIndex.Add(networkDelivery, secondLevelCounter); + m_DeliveryTypesForNetworkVariableGroups.Add(networkDelivery); secondLevelCounter++; } - if (firstLevelIndex[networkChannel] >= m_ChannelMappedNetworkVariableIndexes.Count) + if (firstLevelIndex[networkDelivery] >= m_DeliveryMappedNetworkVariableIndices.Count) { - m_ChannelMappedNetworkVariableIndexes.Add(new HashSet()); + m_DeliveryMappedNetworkVariableIndices.Add(new HashSet()); } - m_ChannelMappedNetworkVariableIndexes[firstLevelIndex[networkChannel]].Add(i); + m_DeliveryMappedNetworkVariableIndices[firstLevelIndex[networkDelivery]].Add(i); } } } @@ -508,7 +507,7 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex) if (!NetworkManager.NetworkConfig.UseSnapshotDelta) { - for (int j = 0; j < m_ChannelMappedNetworkVariableIndexes.Count; j++) + for (int j = 0; j < m_DeliveryMappedNetworkVariableIndices.Count; j++) { using var buffer = PooledNetworkBuffer.Get(); using var writer = PooledNetworkWriter.Get(buffer); @@ -521,9 +520,9 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex) var writtenAny = false; for (int k = 0; k < NetworkVariableFields.Count; k++) { - if (!m_ChannelMappedNetworkVariableIndexes[j].Contains(k)) + if (!m_DeliveryMappedNetworkVariableIndices[j].Contains(k)) { - // This var does not belong to the currently iterating channel group. + // This var does not belong to the currently iterating delivery group. if (NetworkManager.NetworkConfig.EnsureNetworkVariableLengthSafety) { writer.WriteUInt16Packed(0); @@ -590,7 +589,7 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex) if (writtenAny) { var context = NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.NetworkVariableDelta, m_ChannelsForNetworkVariableGroups[j], + MessageQueueContainer.MessageType.NetworkVariableDelta, m_DeliveryTypesForNetworkVariableGroups[j], new[] { clientId }, NetworkUpdateLoop.UpdateStage); if (context != null) { diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 68fa28ed7f..6a9805ebbf 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -641,8 +641,6 @@ private void Initialize(bool server) NetworkConfig.NetworkTransport.OnTransportEvent += HandleRawTransportPoll; - NetworkConfig.NetworkTransport.ResetChannelCache(); - NetworkConfig.NetworkTransport.Initialize(); } @@ -1030,31 +1028,25 @@ public void NetworkUpdate(NetworkUpdateStage updateStage) private void OnNetworkEarlyUpdate() { - if (IsListening) + if (!IsListening) { + return; + } + #if DEVELOPMENT_BUILD || UNITY_EDITOR - s_TransportPoll.Begin(); + s_TransportPoll.Begin(); #endif - var isLoopBack = false; - - //If we are in loopback mode, we don't need to touch the transport - if (!isLoopBack) - { - NetworkEvent networkEvent; - int processedEvents = 0; - do - { - processedEvents++; - networkEvent = NetworkConfig.NetworkTransport.PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime); - HandleRawTransportPoll(networkEvent, clientId, networkChannel, payload, receiveTime); - // 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) - } while (IsListening && networkEvent != NetworkEvent.Nothing); - } + NetworkEvent networkEvent; + do + { + networkEvent = NetworkConfig.NetworkTransport.PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime); + HandleRawTransportPoll(networkEvent, clientId, payload, receiveTime); + // 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) + } while (IsListening && networkEvent != NetworkEvent.Nothing); #if DEVELOPMENT_BUILD || UNITY_EDITOR - s_TransportPoll.End(); + s_TransportPoll.End(); #endif - } } // TODO Once we have a way to subscribe to NetworkUpdateLoop with order we can move this out of NetworkManager but for now this needs to be here because we need strict ordering. @@ -1081,8 +1073,7 @@ private void OnNetworkManagerTick() if (NetworkConfig.EnableNetworkVariable) { // Do NetworkVariable updates - BehaviourUpdater.NetworkBehaviourUpdate(this - ); + BehaviourUpdater.NetworkBehaviourUpdate(this); } int timeSyncFrequencyTicks = (int)(k_TimeSyncFrequency * NetworkConfig.TickRate); @@ -1097,9 +1088,7 @@ private void OnNetworkManagerTick() private void SendConnectionRequest() { var clientIds = new[] { ServerClientId }; - var context = MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.ConnectionRequest, NetworkChannel.Internal, - clientIds, NetworkUpdateStage.EarlyUpdate); + var context = MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.ConnectionRequest, NetworkDelivery.ReliableSequenced, clientIds, NetworkUpdateStage.EarlyUpdate); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -1134,8 +1123,7 @@ private IEnumerator ApprovalTimeout(ulong clientId) } } - private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, NetworkChannel networkChannel, - ArraySegment payload, float receiveTime) + private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, ArraySegment payload, float receiveTime) { NetworkMetrics.TrackTransportBytesReceived(payload.Count); @@ -1182,7 +1170,7 @@ private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, N NetworkLog.LogInfo($"Incoming Data From {clientId}: {payload.Count} bytes"); } - HandleIncomingData(clientId, networkChannel, payload, receiveTime); + HandleIncomingData(clientId, payload, receiveTime); break; } case NetworkEvent.Disconnect: @@ -1217,7 +1205,7 @@ private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, N private readonly NetworkBuffer m_InputBufferWrapper = new NetworkBuffer(new byte[0]); private readonly MessageBatcher m_MessageBatcher = new MessageBatcher(); - internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, ArraySegment data, float receiveTime) + internal void HandleIncomingData(ulong clientId, ArraySegment payload, float receiveTime) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleIncomingData.Begin(); @@ -1228,39 +1216,37 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, NetworkLog.LogInfo("Unwrapping Data Header"); } - m_InputBufferWrapper.SetTarget(data.Array); - m_InputBufferWrapper.SetLength(data.Count + data.Offset); - m_InputBufferWrapper.Position = data.Offset; + m_InputBufferWrapper.SetTarget(payload.Array); + m_InputBufferWrapper.SetLength(payload.Count + payload.Offset); + m_InputBufferWrapper.Position = payload.Offset; using var messageStream = m_InputBufferWrapper; // Client tried to send a network message that was not the connection request before he was accepted. if (MessageQueueContainer.IsUsingBatching()) { - m_MessageBatcher.ReceiveItems(messageStream, ReceiveCallback, clientId, receiveTime, networkChannel); + m_MessageBatcher.ReceiveItems(messageStream, ReceiveCallback, clientId, receiveTime); } else { var messageType = (MessageQueueContainer.MessageType)messageStream.ReadByte(); - MessageHandler.MessageReceiveQueueItem(clientId, messageStream, receiveTime, messageType, networkChannel); - NetworkMetrics.TrackNetworkMessageReceived(clientId, MessageQueueContainer.GetMessageTypeName(messageType), data.Count); + MessageHandler.MessageReceiveQueueItem(clientId, messageStream, receiveTime, messageType); + NetworkMetrics.TrackNetworkMessageReceived(clientId, MessageQueueContainer.GetMessageTypeName(messageType), payload.Count); } #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleIncomingData.End(); #endif } - private void ReceiveCallback(NetworkBuffer messageBuffer, MessageQueueContainer.MessageType messageType, ulong clientId, - float receiveTime, NetworkChannel receiveChannel) + private void ReceiveCallback(NetworkBuffer messageBuffer, MessageQueueContainer.MessageType messageType, ulong clientId, float receiveTime) { - MessageHandler.MessageReceiveQueueItem(clientId, messageBuffer, receiveTime, messageType, receiveChannel); + MessageHandler.MessageReceiveQueueItem(clientId, messageBuffer, receiveTime, messageType); NetworkMetrics.TrackNetworkMessageReceived(clientId, MessageQueueContainer.GetMessageTypeName(messageType), messageBuffer.Length); } /// /// Called when an inbound queued RPC is invoked /// - /// frame queue item to invoke #pragma warning disable 618 internal void InvokeRpc(MessageFrameItem item, NetworkUpdateStage networkUpdateStage) { @@ -1295,7 +1281,7 @@ internal void InvokeRpc(MessageFrameItem item, NetworkUpdateStage networkUpdateS { Receive = new ServerRpcReceiveParams { - UpdateStage = (NetworkUpdateStage)networkUpdateStage, + UpdateStage = networkUpdateStage, SenderClientId = item.NetworkId } }; @@ -1305,7 +1291,7 @@ internal void InvokeRpc(MessageFrameItem item, NetworkUpdateStage networkUpdateS { Receive = new ClientRpcReceiveParams { - UpdateStage = (NetworkUpdateStage)networkUpdateStage + UpdateStage = networkUpdateStage } }; break; @@ -1430,9 +1416,7 @@ private void SyncTime() } ulong[] clientIds = ConnectedClientsIds; - var context = MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.TimeSync, NetworkChannel.SyncChannel, - clientIds, NetworkUpdateStage.EarlyUpdate); + var context = MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.TimeSync, NetworkDelivery.Unreliable, clientIds, NetworkUpdateStage.EarlyUpdate); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -1474,9 +1458,7 @@ internal void HandleApproval(ulong ownerClientId, bool createPlayerObject, uint? // Server doesn't send itself the connection approved message if (ownerClientId != ServerClientId) { - var context = MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.ConnectionApproved, NetworkChannel.Internal, - new ulong[] { ownerClientId }, NetworkUpdateStage.EarlyUpdate); - + var context = MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.ConnectionApproved, NetworkDelivery.ReliableSequenced, new[] { ownerClientId }, NetworkUpdateStage.EarlyUpdate); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -1528,7 +1510,7 @@ internal void HandleApproval(ulong ownerClientId, bool createPlayerObject, uint? /// the prefab GlobalObjectIdHash value for this player internal void ApprovedPlayerSpawn(ulong clientId, uint playerPrefabHash) { - foreach (KeyValuePair clientPair in ConnectedClients) + foreach (var clientPair in ConnectedClients) { if (clientPair.Key == clientId || clientPair.Key == ServerClientId || // Server already spawned it @@ -1538,8 +1520,7 @@ internal void ApprovedPlayerSpawn(ulong clientId, uint playerPrefabHash) continue; //The new client. } - var context = MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.CreateObject, NetworkChannel.Internal, - new[] { clientPair.Key }, NetworkUpdateLoop.UpdateStage); + var context = MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.CreateObject, NetworkDelivery.ReliableSequenced, new[] { clientPair.Key }, NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index dc662c2011..24b8533e4a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -312,9 +312,7 @@ public void NetworkHide(ulong clientId) else { // Send destroy call - var context = NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.DestroyObject, NetworkChannel.Internal, - new[] { clientId }, NetworkUpdateStage.PostLateUpdate); + var context = NetworkManager.MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.DestroyObject, NetworkDelivery.ReliableSequenced, new[] { clientId }, NetworkUpdateStage.PostLateUpdate); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -723,11 +721,7 @@ private void OnTransformParentChanged() m_IsReparented = true; ApplyNetworkParenting(); - var context = NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.ParentSync, NetworkChannel.Internal, - NetworkManager.ConnectedClientsIds.Where((id) => Observers.Contains(id)).ToArray(), - NetworkUpdateLoop.UpdateStage); - + var context = NetworkManager.MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.ParentSync, NetworkDelivery.ReliableSequenced, NetworkManager.ConnectedClientsIds.Where(id => Observers.Contains(id)).ToArray(), NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/SnapshotSystem.cs b/com.unity.netcode.gameobjects/Runtime/Core/SnapshotSystem.cs index 8b5133ea6f..be2d9ae8c8 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/SnapshotSystem.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/SnapshotSystem.cs @@ -701,6 +701,7 @@ private void SendSnapshot(ulong clientId) { m_ClientData.Add(clientId, new ClientData()); } + if (!m_ConnectionRtts.ContainsKey(clientId)) { m_ConnectionRtts.Add(clientId, new ConnectionRtt()); @@ -708,10 +709,7 @@ private void SendSnapshot(ulong clientId) m_ConnectionRtts[clientId].NotifySend(m_ClientData[clientId].SequenceNumber, Time.unscaledTime); - var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.SnapshotData, NetworkChannel.SnapshotExchange, - new[] { clientId }, NetworkUpdateLoop.UpdateStage); - + var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.SnapshotData, NetworkDelivery.Unreliable, new[] { clientId }, NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; diff --git a/com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs b/com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs index 36c45f7111..09d829c474 100644 --- a/com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs +++ b/com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs @@ -56,9 +56,7 @@ private static void LogServer(string message, LogType logType) if (NetworkManager.Singleton != null && !NetworkManager.Singleton.IsServer && NetworkManager.Singleton.NetworkConfig.EnableNetworkLogs) { - var context = NetworkManager.Singleton.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.ServerLog, NetworkChannel.Internal, - new[] { NetworkManager.Singleton.ServerClientId }, NetworkUpdateLoop.UpdateStage); + var context = NetworkManager.Singleton.MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.ServerLog, NetworkDelivery.ReliableSequenced, new[] { NetworkManager.Singleton.ServerClientId }, NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs index 5c03775c85..2a7b0e1314 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs @@ -39,52 +39,48 @@ internal void InvokeUnnamedMessage(ulong clientId, Stream stream) /// Sends unnamed message to a list of clients /// /// The clients to send to, sends to everyone if null - /// The message stream containing the data - /// The channel to send the data on - public void SendUnnamedMessage(List clientIds, NetworkBuffer buffer, NetworkChannel networkChannel = NetworkChannel.Internal) + /// The message stream containing the data + /// The delivery type (QoS) to send data with + public void SendUnnamedMessage(List clientIds, NetworkBuffer messageBuffer, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced) { if (!m_NetworkManager.IsServer) { throw new InvalidOperationException("Can not send unnamed messages to multiple users as a client"); } - var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.UnnamedMessage, networkChannel, - clientIds.ToArray(), NetworkUpdateLoop.UpdateStage); + var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.UnnamedMessage, networkDelivery, clientIds.ToArray(), NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; - buffer.Position = 0; - buffer.CopyTo(nonNullContext.NetworkWriter.GetStream()); + messageBuffer.Position = 0; + messageBuffer.CopyTo(nonNullContext.NetworkWriter.GetStream()); } - m_NetworkManager.NetworkMetrics.TrackUnnamedMessageSent(clientIds, buffer.Length); + m_NetworkManager.NetworkMetrics.TrackUnnamedMessageSent(clientIds, messageBuffer.Length); } /// /// Sends a unnamed message to a specific client /// /// The client to send the message to - /// The message stream containing the data - /// The channel tos end the data on - public void SendUnnamedMessage(ulong clientId, NetworkBuffer buffer, NetworkChannel networkChannel = NetworkChannel.Internal) + /// The message stream containing the data + /// The delivery type (QoS) to send data with + public void SendUnnamedMessage(ulong clientId, NetworkBuffer messageBuffer, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced) { - var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.UnnamedMessage, networkChannel, - new[] { clientId }, NetworkUpdateLoop.UpdateStage); + var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.UnnamedMessage, networkDelivery, new[] { clientId }, NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; - m_NetworkManager.NetworkMetrics.TrackUnnamedMessageSent(clientId, buffer.Position); - buffer.Position = 0; - buffer.CopyTo(nonNullContext.NetworkWriter.GetStream()); + m_NetworkManager.NetworkMetrics.TrackUnnamedMessageSent(clientId, messageBuffer.Position); + messageBuffer.Position = 0; + messageBuffer.CopyTo(nonNullContext.NetworkWriter.GetStream()); } } /// /// Delegate used to handle named messages /// - public delegate void HandleNamedMessageDelegate(ulong sender, Stream payload); + public delegate void HandleNamedMessageDelegate(ulong senderClientId, Stream messagePayload); private Dictionary m_NamedMessageHandlers32 = new Dictionary(); private Dictionary m_NamedMessageHandlers64 = new Dictionary(); @@ -170,26 +166,24 @@ public void UnregisterNamedMessageHandler(string name) /// /// Sends a named message /// - /// The message name to send + /// The message name to send /// The client to send the message to - /// The message stream containing the data - /// The channel to send the data on - public void SendNamedMessage(string name, ulong clientId, Stream stream, NetworkChannel networkChannel = NetworkChannel.Internal) + /// The message stream containing the data + /// The delivery type (QoS) to send data with + public void SendNamedMessage(string messageName, ulong clientId, Stream messageStream, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced) { ulong hash = 0; switch (m_NetworkManager.NetworkConfig.RpcHashSize) { case HashSize.VarIntFourBytes: - hash = XXHash.Hash32(name); + hash = XXHash.Hash32(messageName); break; case HashSize.VarIntEightBytes: - hash = XXHash.Hash64(name); + hash = XXHash.Hash64(messageName); break; } - var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.NamedMessage, networkChannel, - new[] { clientId }, NetworkUpdateLoop.UpdateStage); + var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.NamedMessage, networkDelivery, new[] { clientId }, NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -198,23 +192,23 @@ public void SendNamedMessage(string name, ulong clientId, Stream stream, Network nonNullContext.NetworkWriter.WriteUInt64Packed(hash); - stream.Position = 0; - stream.CopyTo(nonNullContext.NetworkWriter.GetStream()); + messageStream.Position = 0; + messageStream.CopyTo(nonNullContext.NetworkWriter.GetStream()); var size = bufferSizeCapture.StopMeasureSegment(); - m_NetworkManager.NetworkMetrics.TrackNamedMessageSent(clientId, name, size); + m_NetworkManager.NetworkMetrics.TrackNamedMessageSent(clientId, messageName, size); } } /// /// Sends the named message /// - /// The message name to send + /// The message name to send /// The clients to send to, sends to everyone if null - /// The message stream containing the data - /// The channel to send the data on - public void SendNamedMessage(string name, List clientIds, Stream stream, NetworkChannel networkChannel = NetworkChannel.Internal) + /// The message stream containing the data + /// The delivery type (QoS) to send data with + public void SendNamedMessage(string messageName, List clientIds, Stream messageStream, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced) { if (!m_NetworkManager.IsServer) { @@ -225,15 +219,15 @@ public void SendNamedMessage(string name, List clientIds, Stream stream, switch (m_NetworkManager.NetworkConfig.RpcHashSize) { case HashSize.VarIntFourBytes: - hash = XXHash.Hash32(name); + hash = XXHash.Hash32(messageName); break; case HashSize.VarIntEightBytes: - hash = XXHash.Hash64(name); + hash = XXHash.Hash64(messageName); break; } var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.NamedMessage, networkChannel, + MessageQueueContainer.MessageType.NamedMessage, networkDelivery, clientIds.ToArray(), NetworkUpdateLoop.UpdateStage); if (context != null) { @@ -243,11 +237,11 @@ public void SendNamedMessage(string name, List clientIds, Stream stream, nonNullContext.NetworkWriter.WriteUInt64Packed(hash); - stream.Position = 0; - stream.CopyTo(nonNullContext.NetworkWriter.GetStream()); + messageStream.Position = 0; + messageStream.CopyTo(nonNullContext.NetworkWriter.GetStream()); var size = bufferSizeCapture.StopMeasureSegment(); - m_NetworkManager.NetworkMetrics.TrackNamedMessageSent(clientIds, name, size); + m_NetworkManager.NetworkMetrics.TrackNamedMessageSent(clientIds, messageName, size); } } } diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/InternalMessageHandler.cs index 52cb61f30a..4ea516068c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/InternalMessageHandler.cs @@ -233,10 +233,7 @@ public void HandleNetworkVariableDelta(ulong clientId, Stream stream) /// /// Converts the stream to a PerformanceQueueItem and adds it to the receive queue /// - /// - /// - /// - public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, MessageQueueContainer.MessageType messageType, NetworkChannel receiveChannel) + public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, MessageQueueContainer.MessageType messageType) { if (NetworkManager.IsServer && clientId == NetworkManager.ServerClientId) { @@ -269,7 +266,7 @@ public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receive } var messageQueueContainer = NetworkManager.MessageQueueContainer; - messageQueueContainer.AddQueueItemToInboundFrame(messageType, receiveTime, clientId, (NetworkBuffer)stream, receiveChannel); + messageQueueContainer.AddQueueItemToInboundFrame(messageType, receiveTime, clientId, (NetworkBuffer)stream); } public void HandleUnnamedMessage(ulong clientId, Stream stream) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageBatcher.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageBatcher.cs index 978d4fcfa6..13a079ca7b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageBatcher.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageBatcher.cs @@ -8,7 +8,7 @@ internal class MessageBatcher { public class SendStream { - public NetworkChannel NetworkChannel; + public NetworkDelivery Delivery; public PooledNetworkBuffer Buffer; public PooledNetworkWriter Writer; public bool IsEmpty = true; @@ -30,11 +30,11 @@ public void Shutdown() kvp.Value.Writer.Dispose(); kvp.Value.Buffer.Dispose(); } + m_SendDict.Clear(); } - // Used to mark longer lengths. Works because we can't have zero-sized messages private const byte k_LongLenMarker = 0; @@ -83,10 +83,8 @@ private int PopLength(in NetworkBuffer messageBuffer) } /// - /// QueueItem /// Add a FrameQueueItem to be sent - /// queueItem - /// the threshold in bytes + /// public void QueueItem( IReadOnlyCollection targetList, in MessageFrameItem item, @@ -107,19 +105,19 @@ public void QueueItem( if (sendStream.IsEmpty) { sendStream.IsEmpty = false; - sendStream.NetworkChannel = item.NetworkChannel; + sendStream.Delivery = item.Delivery; } // If the item is a different channel we have to flush and change channels. // This isn't great if channels are interleaved, but having a different stream // per channel would create ordering issues. - else if (sendStream.NetworkChannel != item.NetworkChannel) + else if (sendStream.Delivery != item.Delivery) { sendCallback(clientId, sendStream); // clear the batch that was sent from the SendDict sendStream.Buffer.SetLength(0); sendStream.Buffer.Position = 0; - sendStream.NetworkChannel = item.NetworkChannel; + sendStream.Delivery = item.Delivery; } // write the amounts of bytes that are coming up @@ -140,11 +138,9 @@ public void QueueItem( } public delegate void SendCallbackType(ulong clientId, SendStream messageStream); - - public delegate void ReceiveCallbackType(NetworkBuffer messageStream, MessageQueueContainer.MessageType messageType, ulong clientId, float receiveTime, NetworkChannel receiveChannel); + public delegate void ReceiveCallbackType(NetworkBuffer messageStream, MessageQueueContainer.MessageType messageType, ulong clientId, float receiveTime); /// - /// SendItems /// Send any batch of messages that are of length above threshold /// /// the threshold in bytes @@ -171,15 +167,13 @@ public void SendItems(int thresholdBytes, SendCallbackType sendCallback) } /// - /// ReceiveItems /// Process the messageStream and call the callback with individual messages /// /// the messageStream containing the batched messages /// the callback to call has type int f(message, type, clientId, time) - /// the message type to pass back to callback /// the clientId to pass back to callback /// the packet receive time to pass back to callback - public void ReceiveItems(in NetworkBuffer messageBuffer, ReceiveCallbackType receiveCallback, ulong clientId, float receiveTime, NetworkChannel receiveChannel) + public void ReceiveItems(in NetworkBuffer messageBuffer, ReceiveCallbackType receiveCallback, ulong clientId, float receiveTime) { using var copy = PooledNetworkBuffer.Get(); do @@ -199,7 +193,7 @@ public void ReceiveItems(in NetworkBuffer messageBuffer, ReceiveCallbackType rec Buffer.BlockCopy(messageBuffer.GetBuffer(), (int)position, copy.GetBuffer(), 0, messageSize); var messageType = (MessageQueueContainer.MessageType)copy.ReadByte(); - receiveCallback(copy, messageType, clientId, receiveTime, receiveChannel); + receiveCallback(copy, messageType, clientId, receiveTime); // seek over the message // MessageReceiveQueueItem peeks at content, it doesn't advance @@ -207,4 +201,4 @@ public void ReceiveItems(in NetworkBuffer messageBuffer, ReceiveCallbackType rec } while (messageBuffer.Position < messageBuffer.Length); } } -} +} \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageFrameItem.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageFrameItem.cs index 7d099b3d60..d5acb5e836 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageFrameItem.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageFrameItem.cs @@ -18,7 +18,7 @@ internal struct MessageFrameItem /// Sender's network Identifier, or recipient identifier for server RPCs /// public ulong NetworkId; - public NetworkChannel NetworkChannel; + public NetworkDelivery Delivery; /// /// Everything other than server RPCs /// diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs index 314ff409cc..220787157e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs @@ -49,7 +49,7 @@ public enum MessageQueueProcessingTypes static MessageQueueContainer() { var messageTypeNames = new Dictionary(); - foreach(var messageType in Enum.GetValues(typeof(MessageType))) + foreach (var messageType in Enum.GetValues(typeof(MessageType))) { messageTypeNames.Add((int)messageType, messageType.ToString()); } @@ -73,8 +73,6 @@ public static string GetMessageTypeName(MessageType messageType) private MessageQueueProcessor m_MessageQueueProcessor; - private uint m_OutboundFramesProcessed; - private uint m_InboundFramesProcessed; private uint m_MaxFrameHistory; private int m_InboundStreamBufferIndex; private int m_OutBoundStreamBufferIndex; @@ -108,16 +106,6 @@ public void EnableBatchedMessages(bool isbatchingEnabled) m_IsNotUsingBatching = !isbatchingEnabled; } - /// - /// Returns how many frames have been processed (Inbound/Outbound) - /// - /// - /// number of frames procssed - public uint GetStreamBufferFrameCount(MessageQueueHistoryFrame.QueueFrameType queueType) - { - return queueType == MessageQueueHistoryFrame.QueueFrameType.Inbound ? m_InboundFramesProcessed : m_OutboundFramesProcessed; - } - /// /// Creates a context for an internal command. /// The context contains a NetworkWriter property used to fill out the command body. @@ -125,13 +113,12 @@ public uint GetStreamBufferFrameCount(MessageQueueHistoryFrame.QueueFrameType qu /// If not used as IDisposable, the command can be sent by calling context.Finalize() /// /// The type of message being sent - /// The channel the message is being sent on + /// The channel the message is being sent on /// The destinations for this message /// The stage at which the message will be processed on the receiving side /// - internal InternalCommandContext? EnterInternalCommandContext(MessageType messageType, NetworkChannel transportChannel, ulong[] clientIds, NetworkUpdateStage updateStage) + internal InternalCommandContext? EnterInternalCommandContext(MessageType messageType, NetworkDelivery networkDelivery, ulong[] clientIds, NetworkUpdateStage updateStage) { - PooledNetworkWriter writer; if (updateStage == NetworkUpdateStage.Initialization) { NetworkLog.LogWarning($"Trying to send a message of type {messageType} to be executed during Initialization stage. Changing to EarlyUpdate."); @@ -148,8 +135,7 @@ public uint GetStreamBufferFrameCount(MessageQueueHistoryFrame.QueueFrameType qu return null; } - writer = BeginAddQueueItemToFrame(messageType, Time.realtimeSinceStartup, transportChannel, NetworkManager.LocalClientId, - clientIds, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); + var writer = BeginAddQueueItemToFrame(messageType, Time.realtimeSinceStartup, networkDelivery, NetworkManager.LocalClientId, clientIds, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); writer.WriteByte((byte)messageType); writer.WriteByte((byte)updateStage); // NetworkUpdateStage @@ -276,11 +262,9 @@ private void IncrementAndSetQueueHistoryFrame(MessageQueueHistoryFrame messageQu { if (messageQueueFrame.GetQueueFrameType() == MessageQueueHistoryFrame.QueueFrameType.Inbound) { - m_InboundFramesProcessed++; } else { - m_OutboundFramesProcessed++; } } @@ -306,13 +290,13 @@ private static void ResetQueueHistoryFrame(MessageQueueHistoryFrame messageQueue /// AddQueueItemToInboundFrame /// Adds a message queue item to the outbound frame /// - /// type of message - /// when it was received - /// who sent the message - /// the message being received - internal void AddQueueItemToInboundFrame(MessageType qItemType, float timeStamp, ulong sourceNetworkId, NetworkBuffer message, NetworkChannel receiveChannel) + /// type of message + /// when it was received + /// who sent the message + /// the message being received + internal void AddQueueItemToInboundFrame(MessageType messageType, float receiveTimestamp, ulong senderNetworkId, NetworkBuffer messageBuffer) { - var updateStage = (NetworkUpdateStage)message.ReadByte(); + var updateStage = (NetworkUpdateStage)messageBuffer.ReadByte(); var messageFrameItem = GetQueueHistoryFrame(MessageQueueHistoryFrame.QueueFrameType.Inbound, updateStage); messageFrameItem.IsDirty = true; @@ -320,18 +304,17 @@ internal void AddQueueItemToInboundFrame(MessageType qItemType, float timeStamp, long startPosition = messageFrameItem.QueueBuffer.Position; //Write the packed version of the queueItem to our current queue history buffer - messageFrameItem.QueueWriter.WriteUInt16((ushort)qItemType); - messageFrameItem.QueueWriter.WriteSingle(timeStamp); - messageFrameItem.QueueWriter.WriteUInt64(sourceNetworkId); - messageFrameItem.QueueWriter.WriteByte((byte)receiveChannel); + messageFrameItem.QueueWriter.WriteUInt16((ushort)messageType); + messageFrameItem.QueueWriter.WriteSingle(receiveTimestamp); + messageFrameItem.QueueWriter.WriteUInt64(senderNetworkId); //Inbound we copy the entire packet and store the position offset - long streamSize = message.Length - message.Position; + long streamSize = messageBuffer.Length - messageBuffer.Position; messageFrameItem.QueueWriter.WriteInt64(streamSize); // This 0 is an offset into the following stream. Since we're copying from the offset rather than copying the whole buffer, it can stay at 0. // In other words, we're not using the offset anymore, but it's being left for now in case it becomes necessary again later. messageFrameItem.QueueWriter.WriteInt64(0); - messageFrameItem.QueueWriter.WriteBytes(message.GetBuffer(), streamSize, (int)message.Position); + messageFrameItem.QueueWriter.WriteBytes(messageBuffer.GetBuffer(), streamSize, (int)messageBuffer.Position); //Add the packed size to the offsets for parsing over various entries messageFrameItem.QueueItemOffsets.Add((uint)messageFrameItem.QueueBuffer.Position); @@ -381,15 +364,15 @@ public MessageQueueHistoryFrame GetLoopBackHistoryFrame(MessageQueueHistoryFrame /// BeginAddQueueItemToOutboundFrame /// Adds a queue item to the outbound queue frame /// - /// type of the queue item - /// when queue item was submitted - /// channel this queue item is being sent - /// source network id of the sender + /// type of the queue item + /// when queue item was submitted + /// channel this queue item is being sent + /// source network id of the sender /// target network id(s) /// type of queue frame /// what update stage the RPC should be invoked on /// PooledNetworkWriter - public PooledNetworkWriter BeginAddQueueItemToFrame(MessageType qItemType, float timeStamp, NetworkChannel networkChannel, ulong sourceNetworkId, ulong[] targetNetworkIds, + public PooledNetworkWriter BeginAddQueueItemToFrame(MessageType messageType, float sendTimestamp, NetworkDelivery networkDelivery, ulong senderNetworkId, ulong[] targetNetworkIds, MessageQueueHistoryFrame.QueueFrameType queueFrameType, NetworkUpdateStage updateStage) { bool getNextFrame = NetworkManager.IsHost && queueFrameType == MessageQueueHistoryFrame.QueueFrameType.Inbound; @@ -398,10 +381,10 @@ public PooledNetworkWriter BeginAddQueueItemToFrame(MessageType qItemType, float messageQueueHistoryFrame.IsDirty = true; //Write the packed version of the queueItem to our current queue history buffer - messageQueueHistoryFrame.QueueWriter.WriteUInt16((ushort)qItemType); - messageQueueHistoryFrame.QueueWriter.WriteSingle(timeStamp); - messageQueueHistoryFrame.QueueWriter.WriteUInt64(sourceNetworkId); - messageQueueHistoryFrame.QueueWriter.WriteByte((byte)networkChannel); + messageQueueHistoryFrame.QueueWriter.WriteUInt16((ushort)messageType); + messageQueueHistoryFrame.QueueWriter.WriteSingle(sendTimestamp); + messageQueueHistoryFrame.QueueWriter.WriteUInt64(senderNetworkId); + messageQueueHistoryFrame.QueueWriter.WriteByte((byte)networkDelivery); if (queueFrameType != MessageQueueHistoryFrame.QueueFrameType.Inbound) { @@ -728,8 +711,6 @@ private void ClearParameters() { m_InboundStreamBufferIndex = 0; m_OutBoundStreamBufferIndex = 0; - m_OutboundFramesProcessed = 0; - m_InboundFramesProcessed = 0; } /// diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueHistoryFrame.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueHistoryFrame.cs index cfa5f11804..20aa522487 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueHistoryFrame.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueHistoryFrame.cs @@ -78,7 +78,10 @@ internal MessageFrameItem GetCurrentQueueItem() m_CurrentItem.MessageType = (MessageQueueContainer.MessageType)QueueReader.ReadUInt16(); m_CurrentItem.Timestamp = QueueReader.ReadSingle(); m_CurrentItem.NetworkId = QueueReader.ReadUInt64(); - m_CurrentItem.NetworkChannel = (NetworkChannel)QueueReader.ReadByteDirect(); + if (m_QueueFrameType == QueueFrameType.Outbound) + { + m_CurrentItem.Delivery = (NetworkDelivery)QueueReader.ReadByteDirect(); + } //Clear out any current value for the client ids m_CurrentItem.ClientNetworkIds = new ulong[0]; diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueProcessor.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueProcessor.cs index f60c6a9321..840c8251be 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueProcessor.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueProcessor.cs @@ -306,18 +306,18 @@ private void SendCallback(ulong clientId, MessageBatcher.SendStream sendStream) var bytes = sendStream.Buffer.GetBuffer(); var sendBuffer = new ArraySegment(bytes, 0, length); - var channel = sendStream.NetworkChannel; + var networkDelivery = sendStream.Delivery; // If the length is greater than the fragmented threshold, switch to a fragmented channel. // This is kind of a hack to get around issues with certain usages patterns on fragmentation with UNet. // We send everything unfragmented to avoid those issues, and only switch to the fragmented channel // if we have no other choice. if (length > k_FragmentationThreshold) { - channel = NetworkChannel.Fragmented; + networkDelivery = NetworkDelivery.ReliableFragmentedSequenced; } m_MessageQueueContainer.NetworkManager.NetworkMetrics.TrackTransportBytesSent(length); - m_MessageQueueContainer.NetworkManager.NetworkConfig.NetworkTransport.Send(clientId, sendBuffer, channel); + m_MessageQueueContainer.NetworkManager.NetworkConfig.NetworkTransport.Send(clientId, sendBuffer, networkDelivery); } /// @@ -327,20 +327,20 @@ private void SendCallback(ulong clientId, MessageBatcher.SendStream sendStream) /// Information on what to send private void SendFrameQueueItem(IReadOnlyCollection targetIds, in MessageFrameItem item) { - var channel = item.NetworkChannel; + var networkDelivery = item.Delivery; // If the length is greater than the fragmented threshold, switch to a fragmented channel. // This is kind of a hack to get around issues with certain usages patterns on fragmentation with UNet. // We send everything unfragmented to avoid those issues, and only switch to the fragmented channel // if we have no other choice. if (item.MessageData.Count > k_FragmentationThreshold) { - channel = NetworkChannel.Fragmented; + networkDelivery = NetworkDelivery.ReliableFragmentedSequenced; } foreach (var clientId in targetIds) { m_MessageQueueContainer.NetworkManager.NetworkMetrics.TrackTransportBytesSent(item.MessageData.Count); - m_MessageQueueContainer.NetworkManager.NetworkConfig.NetworkTransport.Send(clientId, item.MessageData, channel); + m_MessageQueueContainer.NetworkManager.NetworkConfig.NetworkTransport.Send(clientId, item.MessageData, networkDelivery); } } diff --git a/com.unity.netcode.gameobjects/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs b/com.unity.netcode.gameobjects/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs index 6f627a65b7..3925af0c87 100644 --- a/com.unity.netcode.gameobjects/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs +++ b/com.unity.netcode.gameobjects/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs @@ -93,7 +93,7 @@ public void HandleNetworkVariableDelta(ulong clientId, Stream stream) m_HandleNetworkVariableDelta.End(); } - public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, MessageQueueContainer.MessageType messageType, NetworkChannel receiveChannel) + public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, MessageQueueContainer.MessageType messageType) { switch (messageType) { @@ -108,7 +108,7 @@ public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receive break; } - m_MessageHandler.MessageReceiveQueueItem(clientId, stream, receiveTime, messageType, receiveChannel); + m_MessageHandler.MessageReceiveQueueItem(clientId, stream, receiveTime, messageType); switch (messageType) { diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs index a54bba17be..dc0187b775 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs @@ -87,6 +87,10 @@ public class SceneEvent /// public class NetworkSceneManager { + private const MessageQueueContainer.MessageType k_MessageType = MessageQueueContainer.MessageType.SceneEvent; + private const NetworkDelivery k_DeliveryType = NetworkDelivery.ReliableSequenced; + private const NetworkUpdateStage k_NetworkUpdateStage = NetworkUpdateStage.EarlyUpdate; + // Used to be able to turn re-synchronization off for future snapshot development purposes. internal static bool DisableReSynchronization; @@ -133,7 +137,6 @@ public class NetworkSceneManager /// public VerifySceneBeforeLoadingDelegateHandler VerifySceneBeforeLoading; - internal readonly Dictionary SceneEventProgressTracking = new Dictionary(); /// @@ -195,11 +198,6 @@ public class NetworkSceneManager private NetworkManager m_NetworkManager { get; } - private const MessageQueueContainer.MessageType k_MessageType = MessageQueueContainer.MessageType.SceneEvent; - private const NetworkChannel k_ChannelType = NetworkChannel.Internal; - private const NetworkUpdateStage k_NetworkUpdateStage = NetworkUpdateStage.EarlyUpdate; - - internal Scene DontDestroyOnLoadScene; /// @@ -416,7 +414,7 @@ private void SendSceneEventData(ulong[] targetClientIds) } var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - k_MessageType, k_ChannelType, targetClientIds, k_NetworkUpdateStage); + k_MessageType, k_DeliveryType, targetClientIds, k_NetworkUpdateStage); if (context != null) { @@ -577,7 +575,7 @@ private bool OnSceneEventProgressCompleted(SceneEventProgress sceneEventProgress { // Send a message to all clients that all clients are done loading or unloading var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - k_MessageType, k_ChannelType, m_NetworkManager.ConnectedClientsIds, k_NetworkUpdateStage); + k_MessageType, k_DeliveryType, m_NetworkManager.ConnectedClientsIds, k_NetworkUpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -1044,7 +1042,7 @@ private void OnServerLoadedScene(Scene scene) if (clientId != m_NetworkManager.ServerClientId) { var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - k_MessageType, k_ChannelType, new ulong[] { clientId }, k_NetworkUpdateStage); + k_MessageType, k_DeliveryType, new ulong[] { clientId }, k_NetworkUpdateStage); if (context != null) { // Set the target client id that will be used during in scene NetworkObject serialization @@ -1159,7 +1157,7 @@ internal void SynchronizeNetworkObjects(ulong clientId) ClientSynchEventData.AddSpawnedNetworkObjects(); var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - k_MessageType, k_ChannelType, new ulong[] { clientId }, k_NetworkUpdateStage); + k_MessageType, k_DeliveryType, new ulong[] { clientId }, k_NetworkUpdateStage); if (context != null) { @@ -1312,7 +1310,7 @@ private void ClientLoadedSynchronization(uint sceneIndex, int sceneHandle) ClientSynchEventData.SceneIndex = sceneIndex; var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - k_MessageType, k_ChannelType, new ulong[] { m_NetworkManager.ServerClientId }, k_NetworkUpdateStage); + k_MessageType, k_DeliveryType, new ulong[] { m_NetworkManager.ServerClientId }, k_NetworkUpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 5c603f41f2..764ebf85a0 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -102,9 +102,7 @@ internal void RemoveOwnership(NetworkObject networkObject) networkObject.OwnerClientIdInternal = null; - var context = NetworkManager.MessageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.ChangeOwner, NetworkChannel.Internal, - NetworkManager.ConnectedClientsIds, NetworkUpdateLoop.UpdateStage); + var context = NetworkManager.MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.ChangeOwner, NetworkDelivery.ReliableSequenced, NetworkManager.ConnectedClientsIds, NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -152,9 +150,7 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId) ulong[] clientIds = NetworkManager.ConnectedClientsIds; var messageQueueContainer = NetworkManager.MessageQueueContainer; - var context = messageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.ChangeOwner, NetworkChannel.Internal, - clientIds, NetworkUpdateLoop.UpdateStage); + var context = messageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.ChangeOwner, NetworkDelivery.ReliableSequenced, clientIds, NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -383,9 +379,7 @@ internal void SendSpawnCallForObject(ulong clientId, NetworkObject networkObject var messageQueueContainer = NetworkManager.MessageQueueContainer; - var context = messageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.CreateObject, NetworkChannel.Internal, - new ulong[] { clientId }, NetworkUpdateLoop.UpdateStage); + var context = messageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.CreateObject, NetworkDelivery.ReliableSequenced, new ulong[] { clientId }, NetworkUpdateLoop.UpdateStage); if (context != null) { using var nonNullContext = (InternalCommandContext)context; @@ -667,10 +661,7 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec } } - ulong[] clientIds = NetworkManager.ConnectedClientsIds; - var context = messageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.DestroyObject, NetworkChannel.Internal, - m_TargetClientIds.ToArray(), NetworkUpdateStage.PostLateUpdate); + var context = messageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.DestroyObject, NetworkDelivery.ReliableSequenced, m_TargetClientIds.ToArray(), NetworkUpdateStage.PostLateUpdate); if (context != null) { using var nonNullContext = (InternalCommandContext)context; diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Tests.meta b/com.unity.netcode.gameobjects/Runtime/Transports/Tests.meta deleted file mode 100644 index aa8457e3a9..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Tests.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8ed76ef44843842b3ad15c253703e5c5 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor.meta b/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor.meta deleted file mode 100644 index 84a323f884..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e6aab111d2a894a7e836bdd742e248d9 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs deleted file mode 100644 index c9d5b73600..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; -using Unity.Netcode; -using Unity.Netcode.Transports.UNET; -using UnityEngine.Networking; - -public class TransportTest : MonoBehaviour -{ - // hack, remove any NetworkObject's from the scene to avoid spawning scene objects - // which themselves might not be able initialize themselves properly - private void ForceNetworkObjectShutdown() - { - NetworkObject[] networkObjects = FindObjectsOfType(); - for (int i = 0; i < networkObjects.Length; i++) - { - DestroyImmediate(networkObjects[i]); - } - } - - // A Test behaves as an ordinary method - [Test] - public void UNetCustomChannelRegistrationTest() - { - ForceNetworkObjectShutdown(); - - var o = new GameObject(); - var nm = (NetworkManager)o.AddComponent(typeof(NetworkManager)); - nm.SetSingleton(); - nm.NetworkConfig = new NetworkConfig(); - var ut = (UNetTransport)o.AddComponent(typeof(UNetTransport)); - - ut.ServerListenPort = 7777; - nm.NetworkConfig.NetworkTransport = ut; - - byte customChannel = 0; - - // test 1: add a legit channel. - ut.Channels.Add(new UNetChannel { Id = (byte)(NetworkChannel.ChannelUnused + customChannel), Type = QosType.Unreliable }); - - try - { - nm.StartServer(); - } - catch - { - Assert.Fail("The UNet transport won't allow registration of a legit user channel"); - } - - nm.StopServer(); - nm.Shutdown(); - - ut.Channels.Clear(); - // test 2: add a bogus channel (one that intersects with the netcode built-in ones.) Expect failure - ut.Channels.Add(new UNetChannel { Id = (byte)NetworkChannel.Internal, Type = QosType.Unreliable }); - - try - { - nm.StartServer(); - Assert.Fail("The UNet transport allowed registration of an netcode-reserved channel"); - } - catch (Exception ex) - { - Debug.Log(ex.Message); - } - - nm.StopServer(); - nm.Shutdown(); - } -} diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs.meta b/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs.meta deleted file mode 100644 index d9c5d48f87..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f94b11ceafb6c426aa67067ec95539ed -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/com.unity.netcode.transport.editortest.asmdef b/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/com.unity.netcode.transport.editortest.asmdef deleted file mode 100644 index 822310c7f2..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/com.unity.netcode.transport.editortest.asmdef +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "Unity.Netcode.Transport.EditorTests", - "references": [ - "Unity.Netcode.Runtime" - ], - "optionalUnityReferences": [ - "TestAssemblies" - ], - "includePlatforms": [ - "Editor" - ] -} \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/com.unity.netcode.transport.editortest.asmdef.meta b/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/com.unity.netcode.transport.editortest.asmdef.meta deleted file mode 100644 index 11e47bcb3d..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/com.unity.netcode.transport.editortest.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: cf3c8d3561be742cc889cc4e329fe386 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Tests/Editor/DummyMessageHandler.cs b/com.unity.netcode.gameobjects/Tests/Editor/DummyMessageHandler.cs index 974d77a656..793b2a61a1 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/DummyMessageHandler.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/DummyMessageHandler.cs @@ -28,9 +28,7 @@ public DummyMessageHandler(NetworkManager networkManager) public void HandleNetworkVariableDelta(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleNetworkVariableDelta)); - public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, - MessageQueueContainer.MessageType messageType, - NetworkChannel receiveChannel) + public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, MessageQueueContainer.MessageType messageType) { VerifyCalled(nameof(MessageReceiveQueueItem)); if (NetworkManager) @@ -40,10 +38,8 @@ public void MessageReceiveQueueItem(ulong clientId, Stream stream, float receive // MessageQueueContainer.ProcessMessage, which is where the actual code handling the message lives. // That's what will then call back into this for the others. var messageQueueContainer = NetworkManager.MessageQueueContainer; - messageQueueContainer.AddQueueItemToInboundFrame(messageType, receiveTime, clientId, - (NetworkBuffer)stream, receiveChannel); - messageQueueContainer.ProcessAndFlushMessageQueue( - MessageQueueContainer.MessageQueueProcessingTypes.Receive, NetworkUpdateLoop.UpdateStage); + messageQueueContainer.AddQueueItemToInboundFrame(messageType, receiveTime, clientId, (NetworkBuffer)stream); + messageQueueContainer.ProcessAndFlushMessageQueue(MessageQueueContainer.MessageQueueProcessingTypes.Receive, NetworkUpdateLoop.UpdateStage); messageQueueContainer.AdvanceFrameHistory(MessageQueueHistoryFrame.QueueFrameType.Inbound); } } diff --git a/com.unity.netcode.gameobjects/Tests/Editor/MessageBatcherTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/MessageBatcherTests.cs index a88209bdad..5c29f2ceba 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/MessageBatcherTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/MessageBatcherTests.cs @@ -22,7 +22,7 @@ public void SendWithThreshold() { NetworkId = 123, ClientNetworkIds = new ulong[] { 123 }, - NetworkChannel = NetworkChannel.ChannelUnused + 123, + Delivery = NetworkDelivery.Reliable, MessageType = i % 2 == 0 ? MessageQueueContainer.MessageType.ServerRpc : MessageQueueContainer.MessageType.ClientRpc, MessageData = new ArraySegment(randomData, 0, randomData.Length) }; @@ -52,7 +52,7 @@ public void SendWithThreshold() foreach (var recvStream in sendStreamQueue) { recvStream.Position = 0; - recvBatcher.ReceiveItems(recvStream, (stream, type, id, time, channel) => ++recvItemCounter, default, default, default); + recvBatcher.ReceiveItems(recvStream, (stream, type, id, time) => ++recvItemCounter, default, default); } Assert.AreEqual(k_QueueItemCount, recvItemCounter); @@ -73,7 +73,7 @@ public void SendWithoutThreshold() { NetworkId = 123, ClientNetworkIds = new ulong[] { 123 }, - NetworkChannel = NetworkChannel.ChannelUnused + 123, + Delivery = NetworkDelivery.Reliable, MessageType = i % 2 == 0 ? MessageQueueContainer.MessageType.ServerRpc : MessageQueueContainer.MessageType.ClientRpc, MessageData = new ArraySegment(randomData, 0, randomData.Length) }; @@ -103,7 +103,7 @@ public void SendWithoutThreshold() foreach (var recvStream in sendStreamQueue) { recvStream.Position = 0; - recvBatcher.ReceiveItems(recvStream, (stream, type, id, time, channel) => ++recvItemCounter, default, default, default); + recvBatcher.ReceiveItems(recvStream, (stream, type, id, time) => ++recvItemCounter, default, default); } Assert.AreEqual(k_QueueItemCount, recvItemCounter); diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs index 52f779745b..067c3dc670 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs @@ -40,72 +40,72 @@ public void MessageHandlerReceivedMessageServerClient() LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleConnectionRequest)); using var messageStream0 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ConnectionRequest, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream0.GetBuffer(), 0, (int)messageStream0.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream0.GetBuffer(), 0, (int)messageStream0.Length), 0); // Should not cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); using var messageStream1 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ConnectionApproved, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream1.GetBuffer(), 0, (int)messageStream1.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream1.GetBuffer(), 0, (int)messageStream1.Length), 0); // Should not cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); using var messageStream2 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.CreateObject, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream2.GetBuffer(), 0, (int)messageStream2.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream2.GetBuffer(), 0, (int)messageStream2.Length), 0); // Should not cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); using var messageStream3 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.DestroyObject, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream3.GetBuffer(), 0, (int)messageStream3.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream3.GetBuffer(), 0, (int)messageStream3.Length), 0); // Should not cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleSceneEvent)); using var messageStream4 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.SceneEvent, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream4.GetBuffer(), 0, (int)messageStream4.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream4.GetBuffer(), 0, (int)messageStream4.Length), 0); // Should not cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); using var messageStream5 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ChangeOwner, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream5.GetBuffer(), 0, (int)messageStream5.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream5.GetBuffer(), 0, (int)messageStream5.Length), 0); // Should not cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); using var messageStream6 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.TimeSync, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream6.GetBuffer(), 0, (int)messageStream6.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream6.GetBuffer(), 0, (int)messageStream6.Length), 0); // Should cause log (server and client) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleNetworkVariableDelta)); using var messageStream7 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.NetworkVariableDelta, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream7.GetBuffer(), 0, (int)messageStream7.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream7.GetBuffer(), 0, (int)messageStream7.Length), 0); // Should cause log (server and client) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleUnnamedMessage)); using var messageStream8 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.UnnamedMessage, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream8.GetBuffer(), 0, (int)messageStream8.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream8.GetBuffer(), 0, (int)messageStream8.Length), 0); // Should cause log (server and client) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleNamedMessage)); using var messageStream9 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.NamedMessage, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream9.GetBuffer(), 0, (int)messageStream9.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream9.GetBuffer(), 0, (int)messageStream9.Length), 0); // Should cause log (server only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleNetworkLog)); using var messageStream10 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ServerLog, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream10.GetBuffer(), 0, (int)messageStream10.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream10.GetBuffer(), 0, (int)messageStream10.Length), 0); // Stop server to trigger full shutdown networkManager.StopServer(); @@ -124,76 +124,76 @@ public void MessageHandlerReceivedMessageServerClient() // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); using var messageStream11 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ConnectionRequest, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream11.GetBuffer(), 0, (int)messageStream11.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream11.GetBuffer(), 0, (int)messageStream11.Length), 0); // Should cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleConnectionApproved)); using var messageStream12 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ConnectionApproved, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream12.GetBuffer(), 0, (int)messageStream12.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream12.GetBuffer(), 0, (int)messageStream12.Length), 0); // Should cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleAddObject)); using var messageStream13 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.CreateObject, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream13.GetBuffer(), 0, (int)messageStream13.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream13.GetBuffer(), 0, (int)messageStream13.Length), 0); // Should cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleDestroyObject)); using var messageStream14 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.DestroyObject, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream14.GetBuffer(), 0, (int)messageStream14.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream14.GetBuffer(), 0, (int)messageStream14.Length), 0); // Should cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleSceneEvent)); using var messageStream15 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.SceneEvent, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream15.GetBuffer(), 0, (int)messageStream15.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream15.GetBuffer(), 0, (int)messageStream15.Length), 0); // Should cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleChangeOwner)); using var messageStream16 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ChangeOwner, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream16.GetBuffer(), 0, (int)messageStream16.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream16.GetBuffer(), 0, (int)messageStream16.Length), 0); // Should cause log (client only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleTimeSync)); using var messageStream17 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.TimeSync, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream17.GetBuffer(), 0, (int)messageStream17.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream17.GetBuffer(), 0, (int)messageStream17.Length), 0); // Should cause log (server and client) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleNetworkVariableDelta)); using var messageStream18 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.NetworkVariableDelta, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream18.GetBuffer(), 0, (int)messageStream18.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream18.GetBuffer(), 0, (int)messageStream18.Length), 0); // Should cause log (server and client) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleUnnamedMessage)); using var messageStream19 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.UnnamedMessage, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream19.GetBuffer(), 0, (int)messageStream19.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream19.GetBuffer(), 0, (int)messageStream19.Length), 0); // Should cause log (server and client) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleNamedMessage)); using var messageStream20 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.NamedMessage, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream20.GetBuffer(), 0, (int)messageStream20.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream20.GetBuffer(), 0, (int)messageStream20.Length), 0); // Should not cause log (server only) // Everything should log MessageReceiveQueueItem even if ignored LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem)); using var messageStream21 = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ServerLog, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()); - networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream21.GetBuffer(), 0, (int)messageStream21.Length), 0); + networkManager.HandleIncomingData(0, new ArraySegment(messageStream21.GetBuffer(), 0, (int)messageStream21.Length), 0); // Full cleanup networkManager.StopClient(); @@ -211,14 +211,13 @@ public void MessageHandlerReceivedMessageServerClient() internal class DummyTransport : NetworkTransport { public override ulong ServerClientId { get; } = 0; - public override void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) + public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) { } - public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) + public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) { clientId = 0; - networkChannel = NetworkChannel.Internal; payload = new ArraySegment(); receiveTime = 0; return NetworkEvent.Nothing; diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs index e9b119ec05..2758d1a154 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs @@ -97,7 +97,7 @@ public void HandleNetworkLogCallsUnderlyingHandler() [Test] public void MessageReceiveQueueItemCallsUnderlyingHandler() { - m_Decorator.MessageReceiveQueueItem(0, null, 0.0f, MessageQueueContainer.MessageType.None, NetworkChannel.Internal); + m_Decorator.MessageReceiveQueueItem(0, null, 0.0f, MessageQueueContainer.MessageType.None); LogAssert.Expect(LogType.Log, nameof(m_Decorator.MessageReceiveQueueItem)); } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs index 4cc85f24d1..27cd974770 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs @@ -9,9 +9,9 @@ namespace Unity.Netcode.RuntimeTests { /// /// The RpcQueue unit tests validate: - /// Maximum buffer size that can be sent (currently 1MB is the default maximum RpcQueueHistoryFrame size) - /// That all RPCs invoke at the appropriate NetworkUpdateStage (Client and Server) - /// A lower level RpcQueueContainer test that validates RpcQueueFrameItems after they have been put into the queue + /// - Maximum buffer size that can be sent (currently 1MB is the default maximum `MessageQueueHistoryFrame` size) + /// - That all RPCs invoke at the appropriate `NetworkUpdateStage` (Client and Server) + /// - A lower level `MessageQueueContainer` test that validates `MessageQueueFrameItems` after they have been put into the queue /// public class RpcQueueTests { @@ -112,38 +112,29 @@ public void RpcQueueContainerClass() // Make sure we set testing mode so we don't try to invoke RPCs rpcQueueContainer.SetTestingState(true); - var maxRpcEntries = 8; - var messageChunkSize = 2048; - var preCalculatedBufferValues = new List(messageChunkSize); - + const int maxRpcEntries = 8; + const int messageChunkSize = 2048; + var preCalculatedBufferValues = new List(messageChunkSize); for (int i = 0; i < messageChunkSize; i++) { preCalculatedBufferValues.AddRange(BitConverter.GetBytes(UnityEngine.Random.Range(0, ulong.MaxValue))); } - var indexOffset = 0; ulong senderNetworkId = 1; - // Create fictitious list of clients to send to - ulong[] psuedoClients = new ulong[] { 0 }; - var randomGeneratedDataArray = preCalculatedBufferValues.ToArray(); - var maximumOffsetValue = preCalculatedBufferValues.Count; - + // Create fictitious list of clients to send to + var psuedoClients = new ulong[] { 0 }; // Testing outbound side of the RpcQueueContainer for (int i = 0; i < maxRpcEntries; i++) { // Increment our offset into our randomly generated data for next entry; - indexOffset = (i * messageChunkSize) % maximumOffsetValue; - - var writer = rpcQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ServerRpc, Time.realtimeSinceStartup, NetworkChannel.DefaultMessage, - senderNetworkId, psuedoClients, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); - + var writer = rpcQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ServerRpc, Time.realtimeSinceStartup, NetworkDelivery.Reliable, + senderNetworkId, psuedoClients, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); writer.WriteByteArray(randomGeneratedDataArray, messageChunkSize); - rpcQueueContainer.EndAddQueueItemToFrame(writer, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); } @@ -151,8 +142,6 @@ public void RpcQueueContainerClass() var currentFrame = rpcQueueContainer.GetLoopBackHistoryFrame(MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); // Reset our index offset - indexOffset = 0; - int queueEntryItemCount = 0; // Parse through the entries written to the current RpcQueueHistoryFrame var currentQueueItem = currentFrame.GetFirstQueueItem(); while (currentQueueItem.MessageType != MessageQueueContainer.MessageType.None) @@ -161,13 +150,12 @@ public void RpcQueueContainerClass() Assert.AreEqual(currentQueueItem.NetworkId, senderNetworkId); Assert.AreEqual(currentQueueItem.MessageType, MessageQueueContainer.MessageType.ServerRpc); Assert.AreEqual(currentQueueItem.UpdateStage, NetworkUpdateStage.PostLateUpdate); - Assert.AreEqual(currentQueueItem.NetworkChannel, NetworkChannel.DefaultMessage); + Assert.AreEqual(currentQueueItem.Delivery, NetworkDelivery.Reliable); // Validate the data in the queue Assert.IsTrue(NetworkManagerHelper.BuffersMatch(currentQueueItem.MessageData.Offset, messageChunkSize, currentQueueItem.MessageData.Array, randomGeneratedDataArray)); // Prepare for next queue item - queueEntryItemCount++; currentQueueItem = currentFrame.GetNextQueueItem(); } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs index 1dfb3d6ae8..043ad7aef2 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs @@ -23,7 +23,6 @@ private struct Event public NetworkEvent Type; public ulong ConnectionId; public ArraySegment Data; - public NetworkChannel Channel; } private class Peer @@ -50,7 +49,6 @@ public override void DisconnectLocalClient() m_LocalConnection.IncomingBuffer.Enqueue(new Event { Type = NetworkEvent.Disconnect, - Channel = NetworkChannel.Internal, ConnectionId = m_LocalConnection.ConnectionId, Data = new ArraySegment() }); @@ -80,7 +78,6 @@ public override void DisconnectRemoteClient(ulong clientId) m_Peers[clientId].IncomingBuffer.Enqueue(new Event { Type = NetworkEvent.Disconnect, - Channel = NetworkChannel.Internal, ConnectionId = clientId, Data = new ArraySegment() }); @@ -89,7 +86,6 @@ public override void DisconnectRemoteClient(ulong clientId) m_LocalConnection.IncomingBuffer.Enqueue(new Event { Type = NetworkEvent.Disconnect, - Channel = NetworkChannel.Internal, ConnectionId = clientId, Data = new ArraySegment() }); @@ -126,7 +122,6 @@ public override void Shutdown() onePeer.Value.IncomingBuffer.Enqueue(new Event { Type = NetworkEvent.Disconnect, - Channel = NetworkChannel.Internal, ConnectionId = LocalClientId, Data = new ArraySegment() }); @@ -226,14 +221,14 @@ public override SocketTasks StartServer() return SocketTask.Done.AsTasks(); } - public override void Send(ulong clientId, ArraySegment data, NetworkChannel channel) + public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) { if (m_LocalConnection != null) { // Create copy since netcode wants the byte array back straight after the method call. // Hard on GC. - byte[] copy = new byte[data.Count]; - Buffer.BlockCopy(data.Array, data.Offset, copy, 0, data.Count); + byte[] copy = new byte[payload.Count]; + Buffer.BlockCopy(payload.Array, payload.Offset, copy, 0, payload.Count); if (!m_Peers.ContainsKey(clientId)) { @@ -244,20 +239,18 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne { Type = NetworkEvent.Data, ConnectionId = m_LocalConnection.ConnectionId, - Data = new ArraySegment(copy), - Channel = channel + Data = new ArraySegment(copy) }); } } - public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel channel, out ArraySegment payload, out float receiveTime) + public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) { if (m_LocalConnection != null) { if (m_LocalConnection.IncomingBuffer.Count == 0) { clientId = 0; - channel = NetworkChannel.Internal; payload = new ArraySegment(); receiveTime = 0; return NetworkEvent.Nothing; @@ -266,20 +259,16 @@ public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel ch var peerEvent = m_LocalConnection.IncomingBuffer.Dequeue(); clientId = peerEvent.ConnectionId; - channel = peerEvent.Channel; payload = peerEvent.Data; receiveTime = 0; return peerEvent.Type; } - else - { - clientId = 0; - channel = NetworkChannel.Internal; - payload = new ArraySegment(); - receiveTime = 0; - return NetworkEvent.Nothing; - } + + clientId = 0; + payload = new ArraySegment(); + receiveTime = 0; + return NetworkEvent.Nothing; } } -} +} \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransportTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransportTests.cs index bc507294c9..23cf4141d9 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransportTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransportTests.cs @@ -19,19 +19,19 @@ public void SendReceiveData() client.Initialize(); client.StartClient(); - NetworkEvent serverEvent = server.PollEvent(out ulong clientId, out NetworkChannel _, out _, out _); - NetworkEvent clientEvent = client.PollEvent(out ulong serverId, out NetworkChannel _, out _, out _); + NetworkEvent serverEvent = server.PollEvent(out ulong clientId, out _, out _); + NetworkEvent clientEvent = client.PollEvent(out ulong serverId, out _, out _); // Make sure both connected Assert.True(serverEvent == NetworkEvent.Connect); Assert.True(clientEvent == NetworkEvent.Connect); // Send data - server.Send(clientId, new ArraySegment(Encoding.ASCII.GetBytes("Hello Client")), NetworkChannel.Internal); - client.Send(serverId, new ArraySegment(Encoding.ASCII.GetBytes("Hello Server")), NetworkChannel.Internal); + server.Send(clientId, new ArraySegment(Encoding.ASCII.GetBytes("Hello Client")), NetworkDelivery.ReliableSequenced); + client.Send(serverId, new ArraySegment(Encoding.ASCII.GetBytes("Hello Server")), NetworkDelivery.ReliableSequenced); - serverEvent = server.PollEvent(out ulong newClientId, out NetworkChannel _, out ArraySegment serverPayload, out _); - clientEvent = client.PollEvent(out ulong newServerId, out NetworkChannel _, out ArraySegment clientPayload, out _); + serverEvent = server.PollEvent(out ulong newClientId, out ArraySegment serverPayload, out _); + clientEvent = client.PollEvent(out ulong newServerId, out ArraySegment clientPayload, out _); // Make sure we got data Assert.True(serverEvent == NetworkEvent.Data); @@ -49,4 +49,4 @@ public void SendReceiveData() client.Shutdown(); } } -} +} \ No newline at end of file From 36a85b806b269e18560f33127e8bc60c821db082 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 19:30:02 +0100 Subject: [PATCH 09/14] fix MessageQueueContainer --- .../Runtime/Messaging/MessageQueue/MessageQueueContainer.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs index 220787157e..28b89c329e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs @@ -384,7 +384,10 @@ public PooledNetworkWriter BeginAddQueueItemToFrame(MessageType messageType, flo messageQueueHistoryFrame.QueueWriter.WriteUInt16((ushort)messageType); messageQueueHistoryFrame.QueueWriter.WriteSingle(sendTimestamp); messageQueueHistoryFrame.QueueWriter.WriteUInt64(senderNetworkId); - messageQueueHistoryFrame.QueueWriter.WriteByte((byte)networkDelivery); + if (queueFrameType == MessageQueueHistoryFrame.QueueFrameType.Outbound) + { + messageQueueHistoryFrame.QueueWriter.WriteByte((byte)networkDelivery); + } if (queueFrameType != MessageQueueHistoryFrame.QueueFrameType.Inbound) { From 48c5c04946799dd7c4bdfa62ca2f1e292d92d216 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 19:42:32 +0100 Subject: [PATCH 10/14] update NetworkVariableBase constructor (make NetworkDelivery of NetworkVariable changable) --- .../Runtime/NetworkVariable/NetworkVariableBase.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs b/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs index 7c965a33ff..c7cc232aa9 100644 --- a/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs +++ b/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs @@ -13,14 +13,11 @@ public void Initialize(NetworkBehaviour networkBehaviour) { m_NetworkBehaviour = networkBehaviour; } - /// - /// The delivery type (QoS) to send data with - /// - public NetworkDelivery Delivery = NetworkDelivery.ReliableSequenced; - protected NetworkVariableBase(NetworkVariableReadPermission readPermIn = NetworkVariableReadPermission.Everyone) + protected NetworkVariableBase(NetworkVariableReadPermission readPermIn = NetworkVariableReadPermission.Everyone, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced) { ReadPerm = readPermIn; + Delivery = networkDelivery; } private protected bool m_IsDirty; @@ -36,6 +33,11 @@ protected NetworkVariableBase(NetworkVariableReadPermission readPermIn = Network /// public readonly NetworkVariableReadPermission ReadPerm; + /// + /// The delivery type (QoS) to send data with + /// + public readonly NetworkDelivery Delivery; + /// /// Sets whether or not the variable needs to be delta synced /// From 81d56b12e2a1594230d7d6936cb055bf44b18ed1 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 20:02:57 +0100 Subject: [PATCH 11/14] minor grammar fix --- com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs index 27cd974770..f64da22995 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/RpcQueueTests.cs @@ -125,14 +125,14 @@ public void RpcQueueContainerClass() var randomGeneratedDataArray = preCalculatedBufferValues.ToArray(); // Create fictitious list of clients to send to - var psuedoClients = new ulong[] { 0 }; + var pseudoClients = new ulong[] { 0 }; // Testing outbound side of the RpcQueueContainer for (int i = 0; i < maxRpcEntries; i++) { // Increment our offset into our randomly generated data for next entry; var writer = rpcQueueContainer.BeginAddQueueItemToFrame(MessageQueueContainer.MessageType.ServerRpc, Time.realtimeSinceStartup, NetworkDelivery.Reliable, - senderNetworkId, psuedoClients, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); + senderNetworkId, pseudoClients, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); writer.WriteByteArray(randomGeneratedDataArray, messageChunkSize); rpcQueueContainer.EndAddQueueItemToFrame(writer, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate); From 2393f990a58e2fe7cb7eed27902bdbdad924cc33 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 2 Sep 2021 23:19:33 +0100 Subject: [PATCH 12/14] revert to NetworkVariable.Delivery being an internal const --- .../Runtime/Core/NetworkBehaviour.cs | 2 +- .../Runtime/NetworkVariable/NetworkVariableBase.cs | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs index 3ed2e6ef1e..9c25263d21 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs @@ -442,7 +442,7 @@ internal void InitializeVariables() for (int i = 0; i < NetworkVariableFields.Count; i++) { - var networkDelivery = NetworkVariableFields[i].Delivery; + var networkDelivery = NetworkVariableBase.Delivery; if (!firstLevelIndex.ContainsKey(networkDelivery)) { firstLevelIndex.Add(networkDelivery, secondLevelCounter); diff --git a/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs b/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs index c7cc232aa9..bc782a7476 100644 --- a/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs +++ b/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs @@ -7,6 +7,11 @@ namespace Unity.Netcode /// public abstract class NetworkVariableBase { + /// + /// The delivery type (QoS) to send data with + /// + internal const NetworkDelivery Delivery = NetworkDelivery.ReliableSequenced; + private protected NetworkBehaviour m_NetworkBehaviour; public void Initialize(NetworkBehaviour networkBehaviour) @@ -14,10 +19,9 @@ public void Initialize(NetworkBehaviour networkBehaviour) m_NetworkBehaviour = networkBehaviour; } - protected NetworkVariableBase(NetworkVariableReadPermission readPermIn = NetworkVariableReadPermission.Everyone, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced) + protected NetworkVariableBase(NetworkVariableReadPermission readPermIn = NetworkVariableReadPermission.Everyone) { ReadPerm = readPermIn; - Delivery = networkDelivery; } private protected bool m_IsDirty; @@ -33,11 +37,6 @@ protected NetworkVariableBase(NetworkVariableReadPermission readPermIn = Network /// public readonly NetworkVariableReadPermission ReadPerm; - /// - /// The delivery type (QoS) to send data with - /// - public readonly NetworkDelivery Delivery; - /// /// Sets whether or not the variable needs to be delta synced /// From df1d786b455017bcf22e87a605cd88eac3d649f3 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Fri, 3 Sep 2021 02:20:17 +0100 Subject: [PATCH 13/14] remove channels from UTPTransport --- .../Runtime/UTPTransport.cs | 188 ++++++++---------- 1 file changed, 81 insertions(+), 107 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index e3e23df0fe..a11227ac04 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -17,9 +17,7 @@ public unsafe struct RawNetworkMessage [FieldOffset(0)] public int Length; [FieldOffset(4)] public uint Type; [FieldOffset(8)] public int Id; - [FieldOffset(12)] public byte Padding; - [FieldOffset(13)] public byte ChannelId; - [FieldOffset(14)] public fixed byte Data[NetworkParameterConstants.MTU]; + [FieldOffset(12)] public fixed byte Data[NetworkParameterConstants.MTU]; } [BurstCompile] @@ -29,7 +27,7 @@ internal struct ClientUpdateJob : IJob public NativeArray Connection; public NativeQueue PacketData; - unsafe public void Execute() + public unsafe void Execute() { if (!Connection[0].IsCreated) { @@ -41,28 +39,32 @@ unsafe public void Execute() { if (cmd == NetworkEvent.Type.Connect) { - var d = new RawNetworkMessage { Length = 0, Type = (uint)NetcodeEvent.Connect, Id = Connection[0].InternalId }; - PacketData.Enqueue(d); + var rawMsg = new RawNetworkMessage + { + Length = 0, + Type = (uint)NetcodeEvent.Connect, + Id = Connection[0].InternalId + }; + + PacketData.Enqueue(rawMsg); } else if (cmd == NetworkEvent.Type.Data) { - byte channelId = streamReader.ReadByte(); int messageSize = streamReader.ReadInt(); var temp = new NativeArray(messageSize, Allocator.Temp); streamReader.ReadBytes(temp); - var d = new RawNetworkMessage() + var rawMsg = new RawNetworkMessage { Length = messageSize, Type = (uint)NetcodeEvent.Data, - Id = Connection[0].InternalId, - ChannelId = channelId + Id = Connection[0].InternalId }; - UnsafeUtility.MemCpy(d.Data, temp.GetUnsafePtr(), d.Length); + UnsafeUtility.MemCpy(rawMsg.Data, temp.GetUnsafePtr(), rawMsg.Length); - PacketData.Enqueue(d); + PacketData.Enqueue(rawMsg); } else if (cmd == NetworkEvent.Type.Disconnect) { @@ -81,33 +83,29 @@ internal struct ServerUpdateJob : IJobParallelForDefer private unsafe void QueueMessage(ref DataStreamReader streamReader, int index) { - byte channelId = streamReader.ReadByte(); int messageSize = streamReader.ReadInt(); var temp = new NativeArray(messageSize, Allocator.Temp); streamReader.ReadBytes(temp); - // Debug.Log($"Server: Got a message {channelId} {messageSize} "); - - var d = new RawNetworkMessage() + var rawMsg = new RawNetworkMessage() { Length = messageSize, Type = (uint)NetcodeEvent.Data, - Id = index, - ChannelId = channelId + Id = index }; - UnsafeUtility.MemCpy(d.Data, temp.GetUnsafePtr(), d.Length); - PacketData.Enqueue(d); + UnsafeUtility.MemCpy(rawMsg.Data, temp.GetUnsafePtr(), rawMsg.Length); + + PacketData.Enqueue(rawMsg); } - public unsafe void Execute(int index) + public void Execute(int index) { - DataStreamReader streamReader; Assert.IsTrue(Connections[index].IsCreated); NetworkEvent.Type command; - while ((command = Driver.PopEventForConnection(Connections[index], out streamReader)) != NetworkEvent.Type.Empty) + while ((command = Driver.PopEventForConnection(Connections[index], out var streamReader)) != NetworkEvent.Type.Empty) { if (command == NetworkEvent.Type.Data) { @@ -115,13 +113,25 @@ public unsafe void Execute(int index) } else if (command == NetworkEvent.Type.Connect) { - var d = new RawNetworkMessage() { Length = 0, Type = (uint)NetcodeEvent.Connect, Id = index }; - PacketData.Enqueue(d); + var rawMsg = new RawNetworkMessage + { + Length = 0, + Type = (uint)NetcodeEvent.Connect, + Id = index + }; + + PacketData.Enqueue(rawMsg); } else if (command == NetworkEvent.Type.Disconnect) { - var d = new RawNetworkMessage() { Length = 0, Type = (uint)NetcodeEvent.Disconnect, Id = index }; - PacketData.Enqueue(d); + var rawMsg = new RawNetworkMessage + { + Length = 0, + Type = (uint)NetcodeEvent.Disconnect, + Id = index + }; + + PacketData.Enqueue(rawMsg); Connections[index] = default; } } @@ -147,12 +157,18 @@ public void Execute() } } // Accept new connections - NetworkConnection c; - while ((c = Driver.Accept()) != default(NetworkConnection)) + NetworkConnection conn; + while ((conn = Driver.Accept()) != default) { - Connections.Add(c); - var d = new RawNetworkMessage() { Length = 0, Type = (uint)NetcodeEvent.Connect, Id = c.InternalId }; - PacketData.Enqueue(d); + Connections.Add(conn); + var rawMsg = new RawNetworkMessage + { + Length = 0, + Type = (uint)NetcodeEvent.Connect, + Id = conn.InternalId + }; + + PacketData.Enqueue(rawMsg); Debug.Log("Accepted a connection"); } } @@ -160,28 +176,12 @@ public void Execute() public class UTPTransport : NetworkTransport { - public ushort Port = 7777; public string Address = "127.0.0.1"; + public ushort Port = 7777; - [Serializable] - public struct UTPChannel - { - [HideInInspector] - public byte Id; - public string Name; - public UTPDelivery Flags; - } - - public enum UTPDelivery - { - UnreliableSequenced, - ReliableSequenced, - Unreliable - } - - public NetworkDriver Driver; - public NativeList Connections; - public NativeQueue PacketData; + private NetworkDriver Driver; + private NativeList Connections; + private NativeQueue PacketData; private NativeArray m_PacketProcessBuffer; private JobHandle m_JobHandle; @@ -216,14 +216,13 @@ private NetworkConnection GetConnection(uint id) return default; } - private NetworkPipeline[] m_NetworkPipelines = new NetworkPipeline[3]; + private readonly NetworkPipeline[] m_NetworkPipelines = new NetworkPipeline[3]; public override void Initialize() { Driver = NetworkDriver.Create(); - // So we have a bunch of different pipelines we can send :D - m_NetworkPipelines[0] = Driver.CreatePipeline(typeof(NullPipelineStage)); + m_NetworkPipelines[0] = Driver.CreatePipeline(typeof(FragmentationPipelineStage)); m_NetworkPipelines[1] = Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); m_NetworkPipelines[2] = Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); @@ -232,16 +231,16 @@ public override void Initialize() } [BurstCompile] - public void SendToClient(NativeArray packet, ulong clientId, int index) + private void SendToClient(NativeArray packet, ulong clientId, int pipelineIndex) { - for (int i = 0; i < Connections.Length; i++) + foreach (var targetConn in Connections) { - if (Connections[i].InternalId != (int)clientId) + if (targetConn.InternalId != (int)clientId) { continue; } - var writer = Driver.BeginSend(m_NetworkPipelines[index], Connections[i]); + var writer = Driver.BeginSend(m_NetworkPipelines[pipelineIndex], targetConn); if (!writer.IsCreated) { @@ -254,19 +253,32 @@ public void SendToClient(NativeArray packet, ulong clientId, int index) } } - public override unsafe void Send(ulong clientId, ArraySegment data, NetworkDelivery networkDelivery) + public override unsafe void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) { var pipelineIndex = 0; + switch (networkDelivery) + { + case NetworkDelivery.Unreliable: + case NetworkDelivery.UnreliableSequenced: + pipelineIndex = 2; + break; + case NetworkDelivery.Reliable: + case NetworkDelivery.ReliableSequenced: + pipelineIndex = 1; + break; + case NetworkDelivery.ReliableFragmentedSequenced: + pipelineIndex = 0; + break; + } GetUTPConnectionDetails(clientId, out uint peerId); - var writer = new DataStreamWriter(data.Count + 1 + 4, Allocator.Temp); - writer.WriteByte((byte)networkDelivery); - writer.WriteInt(data.Count); + var writer = new DataStreamWriter(payload.Count + 1 + 4, Allocator.Temp); + writer.WriteInt(payload.Count); - fixed (byte* dataArrayPtr = data.Array) + fixed (byte* dataArrayPtr = payload.Array) { - writer.WriteBytes(dataArrayPtr, data.Count); + writer.WriteBytes(dataArrayPtr, payload.Count); } SendToClient(writer.AsNativeArray(), peerId, pipelineIndex); @@ -288,8 +300,7 @@ private void Update() { if (m_IsServer || m_IsClient) { - RawNetworkMessage message; - while (PacketData.TryDequeue(out message)) + while (PacketData.TryDequeue(out var message)) { var data = m_PacketProcessBuffer.Slice(0, message.Length); unsafe @@ -385,7 +396,6 @@ public override void Shutdown() m_PacketProcessBuffer.Dispose(); } - // This is kind of a mess! public override SocketTasks StartClient() { Connections = new NativeList(1, Allocator.Persistent); @@ -397,48 +407,12 @@ public override SocketTasks StartClient() return SocketTask.Working.AsTasks(); } - public int NetcodeChannelToPipeline(UTPDelivery type) - { - switch (type) - { - case UTPDelivery.UnreliableSequenced: - return 2; - case UTPDelivery.ReliableSequenced: - return 1; - case UTPDelivery.Unreliable: - return 0; - } - - return 0; - } - - public ulong GetNetcodeClientId(uint peerId, bool isServer) - { - if (isServer) - { - return 0; - } - else - { - return peerId + 1; - } - } - - public void GetUTPConnectionDetails(ulong clientId, out uint peerId) - { - if (clientId == 0) - { - peerId = (uint)ServerClientId; - } - else - { - peerId = (uint)clientId - 1; - } - } + private ulong GetNetcodeClientId(uint peerId, bool isServer) => isServer ? (ulong)0 : peerId + 1; + private void GetUTPConnectionDetails(ulong clientId, out uint peerId) => peerId = clientId == 0 ? (uint)ServerClientId : (uint)clientId - 1; public override SocketTasks StartServer() { - Connections = new NativeList(300, Allocator.Persistent); + Connections = new NativeList(0xFF, Allocator.Persistent); var endpoint = NetworkEndPoint.Parse(Address, Port); m_IsServer = true; From 0a965e6f68f7e8d92f33bb25123d32834f512be4 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Fri, 3 Sep 2021 09:36:09 +0100 Subject: [PATCH 14/14] `./standards.py --fix` --- .../Runtime/UTPTransport.cs | 82 +++++++++---------- .../Runtime/Messaging/MessageBatcher.cs | 2 +- .../Runtime/Transports/NetworkTransport.cs | 2 +- .../Runtime/Transports/UNET/UNetTransport.cs | 2 +- .../Tests/Runtime/Transport/SIPTransport.cs | 2 +- .../Runtime/Transport/SIPTransportTests.cs | 2 +- 6 files changed, 46 insertions(+), 46 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index a11227ac04..0c9526bd61 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -179,9 +179,9 @@ public class UTPTransport : NetworkTransport public string Address = "127.0.0.1"; public ushort Port = 7777; - private NetworkDriver Driver; - private NativeList Connections; - private NativeQueue PacketData; + private NetworkDriver m_Driver; + private NativeList m_Connections; + private NativeQueue m_PacketData; private NativeArray m_PacketProcessBuffer; private JobHandle m_JobHandle; @@ -192,20 +192,20 @@ public class UTPTransport : NetworkTransport public override ulong ServerClientId => 0; - public override void DisconnectLocalClient() { _ = Driver.Disconnect(Connections[0]); } + public override void DisconnectLocalClient() { _ = m_Driver.Disconnect(m_Connections[0]); } public override void DisconnectRemoteClient(ulong clientId) { GetUTPConnectionDetails(clientId, out uint peerId); var con = GetConnection(peerId); if (con != default) { - Driver.Disconnect(con); + m_Driver.Disconnect(con); } } private NetworkConnection GetConnection(uint id) { - foreach (var item in Connections) + foreach (var item in m_Connections) { if (item.InternalId == id) { @@ -220,27 +220,27 @@ private NetworkConnection GetConnection(uint id) public override void Initialize() { - Driver = NetworkDriver.Create(); + m_Driver = NetworkDriver.Create(); - m_NetworkPipelines[0] = Driver.CreatePipeline(typeof(FragmentationPipelineStage)); - m_NetworkPipelines[1] = Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); - m_NetworkPipelines[2] = Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); + m_NetworkPipelines[0] = m_Driver.CreatePipeline(typeof(FragmentationPipelineStage)); + m_NetworkPipelines[1] = m_Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); + m_NetworkPipelines[2] = m_Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); - PacketData = new NativeQueue(Allocator.Persistent); + m_PacketData = new NativeQueue(Allocator.Persistent); m_PacketProcessBuffer = new NativeArray(1000, Allocator.Persistent); } [BurstCompile] private void SendToClient(NativeArray packet, ulong clientId, int pipelineIndex) { - foreach (var targetConn in Connections) + foreach (var targetConn in m_Connections) { if (targetConn.InternalId != (int)clientId) { continue; } - var writer = Driver.BeginSend(m_NetworkPipelines[pipelineIndex], targetConn); + var writer = m_Driver.BeginSend(m_NetworkPipelines[pipelineIndex], targetConn); if (!writer.IsCreated) { @@ -249,7 +249,7 @@ private void SendToClient(NativeArray packet, ulong clientId, int pipeline writer.WriteBytes(packet); - Driver.EndSend(writer); + m_Driver.EndSend(writer); } } @@ -300,7 +300,7 @@ private void Update() { if (m_IsServer || m_IsClient) { - while (PacketData.TryDequeue(out var message)) + while (m_PacketData.TryDequeue(out var message)) { var data = m_PacketProcessBuffer.Slice(0, message.Length); unsafe @@ -324,9 +324,9 @@ private void Update() break; case NetcodeEvent.Connect: - { - InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, new ArraySegment(), Time.realtimeSinceStartup); - } + { + InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, new ArraySegment(), Time.realtimeSinceStartup); + } break; case NetcodeEvent.Disconnect: InvokeOnTransportEvent((NetcodeEvent)message.Type, clientId, new ArraySegment(), Time.realtimeSinceStartup); @@ -344,32 +344,32 @@ private void Update() { var connectionJob = new ServerUpdateConnectionsJob { - Driver = Driver, - Connections = Connections, - PacketData = PacketData.AsParallelWriter() + Driver = m_Driver, + Connections = m_Connections, + PacketData = m_PacketData.AsParallelWriter() }; var serverUpdateJob = new ServerUpdateJob { - Driver = Driver.ToConcurrent(), - Connections = Connections.AsDeferredJobArray(), - PacketData = PacketData.AsParallelWriter() + Driver = m_Driver.ToConcurrent(), + Connections = m_Connections.AsDeferredJobArray(), + PacketData = m_PacketData.AsParallelWriter() }; - m_JobHandle = Driver.ScheduleUpdate(); + m_JobHandle = m_Driver.ScheduleUpdate(); m_JobHandle = connectionJob.Schedule(m_JobHandle); - m_JobHandle = serverUpdateJob.Schedule(Connections, 1, m_JobHandle); + m_JobHandle = serverUpdateJob.Schedule(m_Connections, 1, m_JobHandle); } if (m_IsClient) { var job = new ClientUpdateJob { - Driver = Driver, - Connection = Connections, - PacketData = PacketData + Driver = m_Driver, + Connection = m_Connections, + PacketData = m_PacketData }; - m_JobHandle = Driver.ScheduleUpdate(); + m_JobHandle = m_Driver.ScheduleUpdate(); m_JobHandle = job.Schedule(m_JobHandle); } } @@ -382,25 +382,25 @@ public override void Shutdown() { m_JobHandle.Complete(); - if (PacketData.IsCreated) + if (m_PacketData.IsCreated) { - PacketData.Dispose(); + m_PacketData.Dispose(); } - if (Connections.IsCreated) + if (m_Connections.IsCreated) { - Connections.Dispose(); + m_Connections.Dispose(); } - Driver.Dispose(); + m_Driver.Dispose(); m_PacketProcessBuffer.Dispose(); } public override SocketTasks StartClient() { - Connections = new NativeList(1, Allocator.Persistent); + m_Connections = new NativeList(1, Allocator.Persistent); var endpoint = NetworkEndPoint.Parse(Address, Port); - Connections.Add(Driver.Connect(endpoint)); + m_Connections.Add(m_Driver.Connect(endpoint)); m_IsClient = true; Debug.Log("StartClient"); @@ -412,21 +412,21 @@ public override SocketTasks StartClient() public override SocketTasks StartServer() { - Connections = new NativeList(0xFF, Allocator.Persistent); + m_Connections = new NativeList(0xFF, Allocator.Persistent); var endpoint = NetworkEndPoint.Parse(Address, Port); m_IsServer = true; Debug.Log("StartServer"); - if (Driver.Bind(endpoint) != 0) + if (m_Driver.Bind(endpoint) != 0) { Debug.LogError("Failed to bind to port " + Port); } else { - Driver.Listen(); + m_Driver.Listen(); } return SocketTask.Working.AsTasks(); } -} \ No newline at end of file +} diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageBatcher.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageBatcher.cs index 13a079ca7b..ccdb4161b4 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageBatcher.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageBatcher.cs @@ -201,4 +201,4 @@ public void ReceiveItems(in NetworkBuffer messageBuffer, ReceiveCallbackType rec } while (messageBuffer.Position < messageBuffer.Length); } } -} \ No newline at end of file +} diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs index c3d4a64809..3d05f25d2e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs @@ -97,4 +97,4 @@ protected void InvokeOnTransportEvent(NetworkEvent eventType, ulong clientId, Ar /// public abstract void Initialize(); } -} \ No newline at end of file +} diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs index aa5831cc5a..0dad19de39 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UNET/UNetTransport.cs @@ -337,4 +337,4 @@ private ConnectionConfig GetConfig() } } #pragma warning restore CS1591 // Missing XML comment for publicly visible type or member -#pragma warning restore 618 // restore is obsolete \ No newline at end of file +#pragma warning restore 618 // restore is obsolete diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs index 043ad7aef2..1923e47d57 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transport/SIPTransport.cs @@ -271,4 +271,4 @@ public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment