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}"); + } } } }