diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
index fb9e040aa9..03076e657e 100644
--- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
@@ -586,7 +586,7 @@ private void OnEnable()
///
public int MaximumTransmissionUnitSize
{
- set => MessageManager.NonFragmentedMessageMaxSize = value;
+ set => MessageManager.NonFragmentedMessageMaxSize = value & ~7; // Round down to nearest word aligned size
get => MessageManager.NonFragmentedMessageMaxSize;
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkBatchHeader.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkBatchHeader.cs
index 1039ce1b0b..14aed354cb 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkBatchHeader.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkBatchHeader.cs
@@ -12,6 +12,11 @@ internal struct NetworkBatchHeader : INetworkSerializeByMemcpy
///
public ushort Magic;
+ ///
+ /// Total number of messages in the batch.
+ ///
+ public ushort BatchCount;
+
///
/// Total number of bytes in the batch.
///
@@ -22,9 +27,5 @@ internal struct NetworkBatchHeader : INetworkSerializeByMemcpy
///
public ulong BatchHash;
- ///
- /// Total number of messages in the batch.
- ///
- public ushort BatchCount;
}
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs
index dcef1dc378..6caf7310bd 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs
@@ -95,7 +95,7 @@ internal uint GetMessageType(Type t)
return m_MessageTypes[t];
}
- public const int DefaultNonFragmentedMessageMaxSize = 1300;
+ public const int DefaultNonFragmentedMessageMaxSize = 1300 & ~7; // Round down to nearest word aligned size (1296)
public int NonFragmentedMessageMaxSize = DefaultNonFragmentedMessageMaxSize;
public int FragmentedMessageMaxSize = int.MaxValue;
@@ -829,11 +829,17 @@ internal unsafe void ProcessSendQueues()
// Skipping the Verify and sneaking the write mark in because we know it's fine.
queueItem.Writer.Handle->AllowedWriteMark = sizeof(NetworkBatchHeader);
#endif
- queueItem.BatchHeader.BatchHash = XXHash.Hash64(queueItem.Writer.GetUnsafePtr() + sizeof(NetworkBatchHeader), queueItem.Writer.Length - sizeof(NetworkBatchHeader));
- queueItem.BatchHeader.BatchSize = queueItem.Writer.Length;
+
+ var alignedLength = (queueItem.Writer.Length + 7) & ~7;
+ queueItem.Writer.TryBeginWrite(alignedLength);
+
+ queueItem.BatchHeader.BatchHash = XXHash.Hash64(queueItem.Writer.GetUnsafePtr() + sizeof(NetworkBatchHeader), alignedLength - sizeof(NetworkBatchHeader));
+
+ queueItem.BatchHeader.BatchSize = alignedLength;
queueItem.Writer.WriteValue(queueItem.BatchHeader);
+ queueItem.Writer.Seek(alignedLength);
try
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs
index 643a4244e5..94e67e5630 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs
@@ -41,7 +41,7 @@ public IEnumerator TrackTotalNumberOfBytesSent()
}
Assert.True(observer.Found);
- Assert.AreEqual(FastBufferWriter.GetWriteSize(messageName) + k_MessageOverhead, observer.Value);
+ Assert.AreEqual(((FastBufferWriter.GetWriteSize(messageName) + k_MessageOverhead) + 7) & ~7, observer.Value);
}
[UnityTest]
@@ -61,8 +61,6 @@ public IEnumerator TrackTotalNumberOfBytesReceived()
writer.Dispose();
}
-
-
var nbFrames = 0;
while (!observer.Found || nbFrames < 10)
{
@@ -71,7 +69,7 @@ public IEnumerator TrackTotalNumberOfBytesReceived()
}
Assert.True(observer.Found);
- Assert.AreEqual(FastBufferWriter.GetWriteSize(messageName) + k_MessageOverhead, observer.Value);
+ Assert.AreEqual(((FastBufferWriter.GetWriteSize(messageName) + k_MessageOverhead) + 7) & ~7, observer.Value);
}
private class TotalBytesObserver : IMetricObserver
@@ -89,12 +87,22 @@ public TotalBytesObserver(IMetricDispatcher dispatcher, DirectionalMetricInfo me
public long Value { get; private set; }
+ private int m_BytesFoundCounter;
+ private long m_TotalBytes;
+
public void Observe(MetricCollection collection)
{
if (collection.TryGetCounter(m_MetricInfo.Id, out var counter) && counter.Value > 0)
{
- Found = true;
- Value = counter.Value;
+ // Don't assign another observed value once one is already observed
+ if (!Found)
+ {
+ Found = true;
+ Value = counter.Value;
+ m_TotalBytes += ((counter.Value + 7) & ~7);
+ m_BytesFoundCounter++;
+ UnityEngine.Debug.Log($"[{m_BytesFoundCounter}] Bytes Observed {counter.Value} | Total Bytes Observed: {m_TotalBytes}");
+ }
}
}
}