Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Changed

- If m_DisconnectTimeoutMS is set to 0 in the Editor for Unity Transport, the timeout will be entirely disabeled. (#3810)
- Improve performance of `DestroyObjectMessage`. (#3801)
- Improve performance of `CreateObjectMessage`. (#3800)
- First pass of CoreCLR engine API changes. (#3799)
Expand All @@ -51,6 +52,7 @@ Additional documentation and release notes are available at [Multiplayer Documen

- Ensure `NetworkBehaviour.IsSessionOwner` is correctly set when a new session owner is promoted. (#3817)
- Reset extended ownership flags on `NetworkObject` despawn. (#3817)
- Fixed issue where maxCapacity calculation overflows if a developer sets a very, very high (large) m_DisconnectTimeoutMS in the Editor for Unity Transport. (#3810)
- Fixed issues with the "Client-server quickstart for Netcode for GameObjects" script having static methods and properties. (#3787)
- Fixed issue where a warning message was being logged upon a client disconnecting from a server when the log level is set to developer. (#3786)
- Fixed issue where the server or host would no longer have access to the transport id to client id table when processing a transport level client disconnect event. (#3786)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ internal struct BatchedSendQueue : IDisposable
public const int PerMessageOverhead = sizeof(int);

internal const int MinimumMinimumCapacity = 4096;
// int.MaxValue is odd and maximum must be even.
internal const int MaximumMaximumCapacity = int.MaxValue - 1;

// Indices into m_HeadTailIndicies.
private const int k_HeadInternalIndex = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1515,7 +1515,22 @@ public override void Send(ulong clientId, ArraySegment<byte> payload, NetworkDel
// the only case where a full send queue causes a connection loss. Full unreliable
// send queues are dealt with by flushing it out to the network or simply dropping
// new messages if that fails.
var maxCapacity = m_MaxSendQueueSize > 0 ? m_MaxSendQueueSize : m_DisconnectTimeoutMS * k_MaxReliableThroughput;
var maxCapacity = m_MaxSendQueueSize;
if (maxCapacity <= 0)
{
// Setting m_DisconnectTimeoutMS to zero will disable the timeout entirely
// by setting the maxCapacity to it's maximum capacity
if (m_DisconnectTimeoutMS == 0)
{
maxCapacity = BatchedSendQueue.MaximumMaximumCapacity;
}
else
{
// Avoids overflow when m_DisconnectTimeoutMS is set to a very high value
var fullCalculation = Math.BigMul(m_DisconnectTimeoutMS, k_MaxReliableThroughput);
maxCapacity = (int)Math.Min(fullCalculation, BatchedSendQueue.MaximumMaximumCapacity);
}
}

queue = new BatchedSendQueue(Math.Max(maxCapacity, m_MaxPayloadSize));
m_SendQueue.Add(sendTarget, queue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,16 +96,16 @@ public static IEnumerator EnsureNoNetworkEvent(List<TransportEvent> events, floa
}

// Common code to initialize a UnityTransport that logs its events.
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, int disconnectTimeout = NetworkParameterConstants.DisconnectTimeoutMS)
{
InitializeTransport(out transport, out events, string.Empty, maxPayloadSize, maxSendQueueSize, family);
InitializeTransport(out transport, out events, string.Empty, maxPayloadSize, maxSendQueueSize, family, disconnectTimeout);
}

/// <summary>
/// Interanl version with identifier parameter
/// Internal version with identifier parameter
/// </summary>
internal static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, string identifier,
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, int disconnectTimeout = NetworkParameterConstants.DisconnectTimeoutMS)
{
var logger = new TransportEventLogger()
{
Expand All @@ -118,6 +118,7 @@ internal static void InitializeTransport(out UnityTransport transport, out List<
transport.OnTransportEvent += logger.HandleEvent;
transport.MaxPayloadSize = maxPayloadSize;
transport.MaxSendQueueSize = maxSendQueueSize;
transport.DisconnectTimeoutMS = disconnectTimeout;

if (family == NetworkFamily.Ipv6)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,62 @@ public IEnumerator SendMaximumPayloadSize(
yield return null;
}

[UnityTest]
public IEnumerator VeryLargeDisconnectTimeout()
{
// We want something that's over the old limit of ~44KB for reliable payloads.
var payloadSize = 64 * 1024;

var disconnectTimeout = int.MaxValue;

InitializeTransport(out m_Server, out m_ServerEvents, payloadSize, disconnectTimeout: disconnectTimeout);
InitializeTransport(out m_Client1, out m_Client1Events, payloadSize, disconnectTimeout: disconnectTimeout);
Assert.That(m_Server.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));
Assert.That(m_Client1.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));

m_Server.StartServer();
m_Client1.StartClient();

yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);

var payload = new ArraySegment<byte>(Encoding.ASCII.GetBytes("Some message"));
m_Client1.Send(m_Client1.ServerClientId, payload, NetworkDelivery.Reliable);

yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents, MaxNetworkEventWaitTime * 4);

Assert.That(m_ServerEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("Some message")));

yield return null;
}

[UnityTest]
public IEnumerator ZeroDisconnectTimeoutSetToZero()
{
// We want something that's over the old limit of ~44KB for reliable payloads.
var payloadSize = 64 * 1024;

var disconnectTimeout = 0;

InitializeTransport(out m_Server, out m_ServerEvents, payloadSize, disconnectTimeout: disconnectTimeout);
InitializeTransport(out m_Client1, out m_Client1Events, payloadSize, disconnectTimeout: disconnectTimeout);
Assert.That(m_Server.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));
Assert.That(m_Client1.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));

m_Server.StartServer();
m_Client1.StartClient();

yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);

var payload = new ArraySegment<byte>(Encoding.ASCII.GetBytes("Some message"));
m_Client1.Send(m_Client1.ServerClientId, payload, NetworkDelivery.Reliable);

yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents, MaxNetworkEventWaitTime * 4);

Assert.That(m_ServerEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("Some message")));

yield return null;
}

// Check making multiple sends to a client in a single frame.
[UnityTest]
public IEnumerator MultipleSendsSingleFrame(
Expand Down