Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
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 @@ -10,6 +10,8 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Added

- Added: Message size limits (max single message and max fragmented message) can now be set using NetworkManager.SetMaxSingleMessageSize() and NetworkManager.SetMaxFragmentedMessageSize() for transports that don't work with the default values (#2530)

### Fixed

- Fixed Multiplayer Tools package installation docs page link on the NetworkManager popup. (#2526)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ public class NetworkConfig
public string ToBase64()
{
NetworkConfig config = this;
var writer = new FastBufferWriter(NetworkMessageManager.NonFragmentedMessageMaxSize, Allocator.Temp);
var writer = new FastBufferWriter(1024, Allocator.Temp);
using (writer)
{
writer.WriteValueSafe(config.ProtocolVersion);
Expand Down Expand Up @@ -228,7 +228,7 @@ public ulong GetConfig(bool cache = true)
return m_ConfigHash.Value;
}

var writer = new FastBufferWriter(NetworkMessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, int.MaxValue);
var writer = new FastBufferWriter(1024, Allocator.Temp, int.MaxValue);
using (writer)
{
writer.WriteValueSafe(ProtocolVersion);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
networkDelivery = NetworkDelivery.ReliableFragmentedSequenced;
break;
case RpcDelivery.Unreliable:
if (bufferWriter.Length > NetworkMessageManager.NonFragmentedMessageMaxSize)
if (bufferWriter.Length > NetworkManager.MessageManager.NonFragmentedMessageMaxSize)
{
throw new OverflowException("RPC parameters are too large for unreliable delivery.");
}
Expand Down Expand Up @@ -144,7 +144,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
networkDelivery = NetworkDelivery.ReliableFragmentedSequenced;
break;
case RpcDelivery.Unreliable:
if (bufferWriter.Length > NetworkMessageManager.NonFragmentedMessageMaxSize)
if (bufferWriter.Length > NetworkManager.MessageManager.NonFragmentedMessageMaxSize)
{
throw new OverflowException("RPC parameters are too large for unreliable delivery.");
}
Expand Down Expand Up @@ -691,7 +691,7 @@ private void NetworkVariableUpdate(ulong targetClientId, int behaviourIndex)
// so we don't have to do this serialization work if we're not going to use the result.
if (IsServer && targetClientId == NetworkManager.ServerClientId)
{
var tmpWriter = new FastBufferWriter(NetworkMessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkMessageManager.FragmentedMessageMaxSize);
var tmpWriter = new FastBufferWriter(NetworkManager.MessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkManager.MessageManager.FragmentedMessageMaxSize);
using (tmpWriter)
{
message.Serialize(tmpWriter, message.Version);
Expand Down
14 changes: 14 additions & 0 deletions com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,20 @@ private void OnEnable()
/// <param name="prefab"></param>
public void RemoveNetworkPrefab(GameObject prefab) => PrefabHandler.RemoveNetworkPrefab(prefab);

/// <summary>
/// Sets the maximum size of a single non-fragmented message (or message batch) passed through the transport.
/// This should represent the transport's MTU size, minus any transport-level overhead.
/// </summary>
/// <param name="size"></param>
public void SetMaxSingleMessageSize(int size) => MessageManager.SetMaxSingleMessageSize(size);

/// <summary>
/// Sets the maximum size of a message (or message batch) passed through the transport with the ReliableFragmented delivery.
/// Warning: setting this value too low may result in the SDK becoming non-functional with projects that have a large number of NetworkBehaviours or NetworkVariables, as the SDK relies on the transport's ability to fragment some messages when they grow beyond the MTU size.
/// </summary>
/// <param name="size"></param>
public void SetMaxFragmentedMessageSize(int size) => MessageManager.SetMaxFragmentedMessageSize(size);

Comment on lines +583 to +604
Copy link
Copy Markdown
Contributor

@0xFA11 0xFA11 Apr 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 things:

  1. I'd suggest get; set; property here (so that users could get the value without setting it)
  2. I'd suggest naming these APIs as int MaximumTransmissionUnitSize { get; set; } & int MaximumFragmentedMessageSize { get; set; } because it looks like they boil down to those two concepts.

internal void Initialize(bool server)
{
// Don't allow the user to start a network session if the NetworkManager is
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
{
if (NetworkBehaviour.NetworkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
{
var tempWriter = new FastBufferWriter(NetworkMessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkMessageManager.FragmentedMessageMaxSize);
var tempWriter = new FastBufferWriter(NetworkBehaviour.NetworkManager.MessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkBehaviour.NetworkManager.MessageManager.FragmentedMessageMaxSize);
NetworkBehaviour.NetworkVariableFields[i].WriteDelta(tempWriter);
BytePacker.WriteValueBitPacked(writer, tempWriter.Length);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ internal uint GetMessageType(Type t)
return m_MessageTypes[t];
}

public const int NonFragmentedMessageMaxSize = 1300;
public const int FragmentedMessageMaxSize = int.MaxValue;
public int NonFragmentedMessageMaxSize = 1300;
Comment thread
ShadauxCat marked this conversation as resolved.
Outdated
public int FragmentedMessageMaxSize = int.MaxValue;

internal struct MessageWithHandler
{
Expand Down Expand Up @@ -160,6 +160,16 @@ public NetworkMessageManager(INetworkMessageSender sender, object owner, INetwor
}
}

public void SetMaxSingleMessageSize(int size)
{
NonFragmentedMessageMaxSize = size;
}

public void SetMaxFragmentedMessageSize(int size)
{
FragmentedMessageMaxSize = size;
}

public void Dispose()
{
if (m_Disposed)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ public void WhenNotExceedingBatchSize_NewBatchesAreNotCreated()
{
var message = GetMessage();
var size = UnsafeUtility.SizeOf<TestMessage>() + 2; // MessageHeader packed with this message will be 2 bytes
for (var i = 0; i < (1300 - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size; ++i)
for (var i = 0; i < (m_MessageManager.NonFragmentedMessageMaxSize - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size; ++i)
{
m_MessageManager.SendMessage(ref message, NetworkDelivery.Reliable, m_Clients);
}
Expand All @@ -167,11 +167,12 @@ public void WhenNotExceedingBatchSize_NewBatchesAreNotCreated()
}

[Test]
public void WhenExceedingBatchSize_NewBatchesAreCreated()
public void WhenExceedingBatchSize_NewBatchesAreCreated([Values(500, 1000, 1300, 2000)] int maxMessageSize)
{
var message = GetMessage();
m_MessageManager.SetMaxSingleMessageSize(maxMessageSize);
var size = UnsafeUtility.SizeOf<TestMessage>() + 2; // MessageHeader packed with this message will be 2 bytes
for (var i = 0; i < ((1300 - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size) + 1; ++i)
for (var i = 0; i < ((m_MessageManager.NonFragmentedMessageMaxSize - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size) + 1; ++i)
{
m_MessageManager.SendMessage(ref message, NetworkDelivery.Reliable, m_Clients);
}
Expand All @@ -181,11 +182,12 @@ public void WhenExceedingBatchSize_NewBatchesAreCreated()
}

[Test]
public void WhenExceedingMTUSizeWithFragmentedDelivery_NewBatchesAreNotCreated()
public void WhenExceedingMTUSizeWithFragmentedDelivery_NewBatchesAreNotCreated([Values(500, 1000, 1300, 2000)] int maxMessageSize)
{
var message = GetMessage();
m_MessageManager.SetMaxSingleMessageSize(maxMessageSize);
var size = UnsafeUtility.SizeOf<TestMessage>() + 2; // MessageHeader packed with this message will be 2 bytes
for (var i = 0; i < ((1300 - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size) + 1; ++i)
for (var i = 0; i < ((m_MessageManager.NonFragmentedMessageMaxSize - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size) + 1; ++i)
{
m_MessageManager.SendMessage(ref message, NetworkDelivery.ReliableFragmentedSequenced, m_Clients);
}
Expand Down Expand Up @@ -291,7 +293,7 @@ public void WhenReceivingAMessageWithoutAHandler_ExceptionIsLogged()

var message = GetMessage();

var writer = new FastBufferWriter(1300, Allocator.Temp);
var writer = new FastBufferWriter(m_MessageManager.NonFragmentedMessageMaxSize, Allocator.Temp);
using (writer)
{
writer.TryBeginWrite(FastBufferWriter.GetWriteSize(message));
Expand Down