Skip to content

Commit d118767

Browse files
refactor
Minor performance gain by using a pre-defined static network delivery that is registered by message type within MessageDelivery.
1 parent 77cf501 commit d118767

File tree

13 files changed

+75
-35
lines changed

13 files changed

+75
-35
lines changed

com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,7 @@ public enum AuthorityModes
13351335
/// </remarks>
13361336
[Tooltip("When set, NetworkTransform will send common state updates using unreliable network delivery " +
13371337
"to provide a higher tolerance to poor network conditions (especially packet loss). When disabled, all state updates are " +
1338-
"sent using reliable fragmented sequenced network delivery.")]
1338+
"sent using reliable fragmented sequenced network delivery. Note: This will change the order of operations between transform state updates and other messages sent reliably.")]
13391339
public bool UseUnreliableDeltas = false;
13401340

13411341
/// <summary>
@@ -4722,7 +4722,7 @@ private void UpdateTransformState()
47224722
// - If sending an UnrealiableFrameSync or synchronizing the base position of the NetworkDeltaPosition
47234723
var networkDelivery = !UseUnreliableDeltas | m_LocalAuthoritativeNetworkState.IsTeleportingNextFrame | m_LocalAuthoritativeNetworkState.IsSynchronizing
47244724
| m_LocalAuthoritativeNetworkState.UnreliableFrameSync | m_LocalAuthoritativeNetworkState.SynchronizeBaseHalfFloat
4725-
? MessageDelivery.GetDelivery(NetworkMessageTypes.NetworkTransformMessage) : NetworkDelivery.UnreliableSequenced;
4725+
? MessageDeliveryType<NetworkTransformMessage>.DefaultDelivery : NetworkDelivery.UnreliableSequenced;
47264726

47274727
// Server-host-dahost always sends updates to all clients (but itself)
47284728
if (IsServer)

com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ private void SendConnectionRequest()
635635
}
636636
}
637637

638-
SendMessage(ref message, MessageDelivery.GetDelivery(NetworkMessageTypes.ConnectionRequest), NetworkManager.ServerClientId);
638+
SendMessage(ref message, MessageDeliveryType<ConnectionRequestMessage>.DefaultDelivery, NetworkManager.ServerClientId);
639639
message.MessageVersions.Dispose();
640640
}
641641

@@ -857,7 +857,7 @@ internal void HandleConnectionApproval(ulong ownerClientId, NetworkManager.Conne
857857
}
858858
if (!MockSkippingApproval)
859859
{
860-
SendMessage(ref message, MessageDelivery.GetDelivery(NetworkMessageTypes.ConnectionApproved), ownerClientId);
860+
SendMessage(ref message, MessageDeliveryType<ConnectionApprovedMessage>.DefaultDelivery, ownerClientId);
861861
}
862862
else
863863
{
@@ -987,7 +987,7 @@ internal void ApprovedPlayerSpawn(ulong clientId, uint playerPrefabHash)
987987
message.ObjectInfo.HasParent = false;
988988
message.ObjectInfo.IsPlayerObject = true;
989989
message.ObjectInfo.OwnerClientId = clientId;
990-
var size = SendMessage(ref message, MessageDelivery.GetDelivery(NetworkMessageTypes.CreateObject), clientPair.Key);
990+
var size = SendMessage(ref message, MessageDeliveryType<CreateObjectMessage>.DefaultDelivery, clientPair.Key);
991991
NetworkManager.NetworkMetrics.TrackObjectSpawnSent(clientPair.Key, ConnectedClients[clientId].PlayerObject, size);
992992
}
993993
}
@@ -1021,7 +1021,7 @@ internal NetworkClient AddClient(ulong clientId)
10211021
{
10221022
ConnectedClientsList.Add(networkClient);
10231023
}
1024-
var networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.ClientConnected);
1024+
var networkDelivery = MessageDeliveryType<ClientConnectedMessage>.DefaultDelivery;
10251025
if (NetworkManager.LocalClientId != clientId)
10261026
{
10271027
if ((!NetworkManager.DistributedAuthorityMode && NetworkManager.IsServer) ||
@@ -1286,7 +1286,7 @@ internal void OnClientDisconnectFromServer(ulong clientId)
12861286

12871287
ConnectedClientIds.Remove(clientId);
12881288
var message = new ClientDisconnectedMessage { ClientId = clientId };
1289-
MessageManager?.SendMessage(ref message, MessageDelivery.GetDelivery(NetworkMessageTypes.ClientDisconnected), ConnectedClientIds);
1289+
MessageManager?.SendMessage(ref message, MessageDeliveryType<ClientDisconnectedMessage>.DefaultDelivery, ConnectedClientIds);
12901290

12911291
// Used for testing/validation purposes only
12921292
#if ENABLE_DAHOST_AUTOPROMOTE_SESSION_OWNER

com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
104104
{
105105
default:
106106
case RpcDelivery.Reliable:
107-
networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.ServerRpc);
107+
networkDelivery = MessageDeliveryType<ServerRpcMessage>.DefaultDelivery;
108108
break;
109109
case RpcDelivery.Unreliable:
110110
if (bufferWriter.Length > networkManager.MessageManager.NonFragmentedMessageMaxSize)
@@ -190,7 +190,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
190190
{
191191
default:
192192
case RpcDelivery.Reliable:
193-
networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.ClientRpc);
193+
networkDelivery = MessageDeliveryType<ClientRpcMessage>.DefaultDelivery;
194194
break;
195195
case RpcDelivery.Unreliable:
196196
if (bufferWriter.Length > networkManager.MessageManager.NonFragmentedMessageMaxSize)
@@ -358,7 +358,7 @@ internal void __endSendRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId,
358358
{
359359
default:
360360
case RpcDelivery.Reliable:
361-
networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.Rpc);
361+
networkDelivery = MessageDeliveryType<RpcMessage>.DefaultDelivery;
362362
break;
363363
case RpcDelivery.Unreliable:
364364
if (bufferWriter.Length > NetworkManager.MessageManager.NonFragmentedMessageMaxSize)
@@ -1014,7 +1014,7 @@ internal void InitializeVariables()
10141014

10151015
for (int i = 0; i < NetworkVariableFields.Count; i++)
10161016
{
1017-
var networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.NetworkVariableDelta);
1017+
var networkDelivery = MessageDeliveryType<NetworkVariableDeltaMessage>.DefaultDelivery;
10181018
if (!firstLevelIndex.ContainsKey(networkDelivery))
10191019
{
10201020
firstLevelIndex.Add(networkDelivery, secondLevelCounter);

com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ internal void PromoteSessionOwner(ulong clientId)
256256
var clients = ConnectionManager.ConnectedClientIds.Where(c => c != LocalClientId).ToArray();
257257
foreach (var targetClient in clients)
258258
{
259-
ConnectionManager.SendMessage(ref sessionOwnerMessage, MessageDelivery.GetDelivery(NetworkMessageTypes.SessionOwner), targetClient);
259+
ConnectionManager.SendMessage(ref sessionOwnerMessage, MessageDeliveryType<SessionOwnerMessage>.DefaultDelivery, targetClient);
260260
}
261261
}
262262

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,7 @@ public OwnershipRequestStatus RequestOwnership()
798798
};
799799

800800
var sendTarget = NetworkManager.DAHost ? OwnerClientId : NetworkManager.ServerClientId;
801-
NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, MessageDelivery.GetDelivery(NetworkMessageTypes.ChangeOwnership), sendTarget);
801+
NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, MessageDeliveryType<ChangeOwnershipMessage>.DefaultDelivery, sendTarget);
802802

803803
return OwnershipRequestStatus.RequestSent;
804804
}
@@ -885,7 +885,7 @@ internal void OwnershipRequest(ulong clientRequestingOwnership)
885885
};
886886

887887
var sendTarget = NetworkManager.DAHost ? clientRequestingOwnership : NetworkManager.ServerClientId;
888-
NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, MessageDelivery.GetDelivery(NetworkMessageTypes.ChangeOwnership), sendTarget);
888+
NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, MessageDeliveryType<ChangeOwnershipMessage>.DefaultDelivery, sendTarget);
889889
}
890890
}
891891

@@ -1071,7 +1071,7 @@ internal void SendOwnershipStatusUpdate()
10711071
DistributedAuthorityMode = true,
10721072
OwnershipFlags = (ushort)Ownership,
10731073
};
1074-
var networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.ChangeOwnership);
1074+
10751075
if (NetworkManager.DAHost)
10761076
{
10771077
foreach (var clientId in Observers)
@@ -1080,14 +1080,14 @@ internal void SendOwnershipStatusUpdate()
10801080
{
10811081
continue;
10821082
}
1083-
NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, networkDelivery, clientId);
1083+
NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, MessageDeliveryType<ChangeOwnershipMessage>.DefaultDelivery, clientId);
10841084
}
10851085
}
10861086
else
10871087
{
10881088
changeOwnership.ClientIdCount = Observers.Count();
10891089
changeOwnership.ClientIds = Observers.ToArray();
1090-
NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, networkDelivery, NetworkManager.ServerClientId);
1090+
NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, MessageDeliveryType<ChangeOwnershipMessage>.DefaultDelivery, NetworkManager.ServerClientId);
10911091
}
10921092
}
10931093

@@ -1605,34 +1605,33 @@ public void NetworkHide(ulong clientId)
16051605
DeferredDespawnTick = DeferredDespawnTick,
16061606
};
16071607

1608-
var networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.DestroyObject);
16091608
var size = 0;
16101609
if (NetworkManager.DistributedAuthorityMode)
16111610
{
16121611
if (!NetworkManager.DAHost)
16131612
{
16141613
// Send destroy call to service or DAHost
1615-
size = NetworkManager.ConnectionManager.SendMessage(ref message, networkDelivery, NetworkManager.ServerClientId);
1614+
size = NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<DestroyObjectMessage>.DefaultDelivery, NetworkManager.ServerClientId);
16161615
}
16171616
else // DAHost mocking service
16181617
{
16191618
// Send destroy call
1620-
size = NetworkManager.ConnectionManager.SendMessage(ref message, networkDelivery, clientId);
1619+
size = NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<DestroyObjectMessage>.DefaultDelivery, clientId);
16211620
// Broadcast the destroy to all clients so they can update their observers list
16221621
foreach (var client in NetworkManager.ConnectionManager.ConnectedClientIds)
16231622
{
16241623
if (client == clientId || client == NetworkManager.LocalClientId)
16251624
{
16261625
continue;
16271626
}
1628-
size += NetworkManager.ConnectionManager.SendMessage(ref message, networkDelivery, client);
1627+
size += NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<DestroyObjectMessage>.DefaultDelivery, client);
16291628
}
16301629
}
16311630
}
16321631
else
16331632
{
16341633
// Send destroy call
1635-
size = NetworkManager.ConnectionManager.SendMessage(ref message, networkDelivery, clientId);
1634+
size = NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<DestroyObjectMessage>.DefaultDelivery, clientId);
16361635
}
16371636
NetworkManager.NetworkMetrics.TrackObjectDestroySent(clientId, this, size);
16381637
}
@@ -2393,13 +2392,13 @@ private void OnTransformParentChanged()
23932392
{
23942393
m_CachedWorldPositionStays = true;
23952394
}
2396-
var networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.ParentSync);
2395+
23972396
// If we are connected to a CMB service or we are running a mock CMB service then send to the "server" identifier
23982397
if (distributedAuthority || (!distributedAuthority && AllowOwnerToParent && IsOwner && !NetworkManager.IsServer))
23992398
{
24002399
if (!NetworkManager.DAHost)
24012400
{
2402-
NetworkManager.ConnectionManager.SendMessage(ref message, networkDelivery, 0);
2401+
NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<ParentSyncMessage>.DefaultDelivery, 0);
24032402
return;
24042403
}
24052404
else
@@ -2410,7 +2409,7 @@ private void OnTransformParentChanged()
24102409
{
24112410
continue;
24122411
}
2413-
NetworkManager.ConnectionManager.SendMessage(ref message, networkDelivery, clientId);
2412+
NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<ParentSyncMessage>.DefaultDelivery, clientId);
24142413
}
24152414
}
24162415
}
@@ -2434,7 +2433,7 @@ private void OnTransformParentChanged()
24342433
clientIds[idx++] = clientId;
24352434
}
24362435
}
2437-
NetworkManager.ConnectionManager.SendMessage(ref message, networkDelivery, clientIds, idx);
2436+
NetworkManager.ConnectionManager.SendMessage(ref message, MessageDeliveryType<ParentSyncMessage>.DefaultDelivery, clientIds, idx);
24382437
}
24392438
}
24402439
}

com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,13 @@ private static void LogServer(string message, LogType logType)
102102

103103
if (!isServer && networkManager.NetworkConfig.EnableNetworkLogs)
104104
{
105-
var networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.ServerLog);
106105
var networkMessage = new ServerLogMessage
107106
{
108107
LogType = logType,
109108
Message = message,
110109
SenderId = localId
111110
};
112-
var size = networkManager.ConnectionManager.SendMessage(ref networkMessage, networkDelivery, NetworkManager.ServerClientId);
111+
var size = networkManager.ConnectionManager.SendMessage(ref networkMessage, MessageDeliveryType<ServerLogMessage>.DefaultDelivery, NetworkManager.ServerClientId);
113112
networkManager.NetworkMetrics.TrackServerLogSent(NetworkManager.ServerClientId, (uint)logType, size);
114113
}
115114
}

com.unity.netcode.gameobjects/Runtime/Messaging/INetworkMessage.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,14 @@ internal interface INetworkMessage
4444
void Handle(ref NetworkContext context);
4545
int Version { get; }
4646
}
47+
48+
49+
internal static class MessageDeliveryType<T> where T : INetworkMessage
50+
{
51+
internal static NetworkDelivery DefaultDelivery { get; private set; }
52+
internal static void Initialize()
53+
{
54+
DefaultDelivery = MessageDelivery.GetDelivery(typeof(T));
55+
}
56+
}
4757
}

com.unity.netcode.gameobjects/Runtime/Messaging/MessageDelivery.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using Unity.Netcode;
4+
using Unity.Netcode.Components;
45
using UnityEditor;
56
using UnityEngine;
67

@@ -24,6 +25,15 @@ private static void OnApplicationStart()
2425
UpdateMessageTypes();
2526
}
2627

28+
/// <summary>
29+
/// FIrst pass at providing an easier path to configuring the network
30+
/// delivery type for the message type.
31+
/// TODO: Once <see cref="NetworkMessageManager"/> coalesces all reliable messages
32+
/// and/or organizes by a more unified order of operation tracking built into the
33+
/// buffer and/or converts all places that would normally generate a message to
34+
/// commands that will, eventually, generate messages.
35+
/// For now, we are sending all reliable fragmented sequenced.
36+
/// </summary>
2737
private static void UpdateMessageTypes()
2838
{
2939
s_MessageToDelivery.Clear();
@@ -38,6 +48,28 @@ private static void UpdateMessageTypes()
3848
s_MessageToDelivery.Add(messageType, NetworkDelivery.ReliableFragmentedSequenced);
3949
}
4050
s_MessageToMessageType = ILPPMessageProvider.GetMessageTypesMap();
51+
52+
// Fast path look-ups
53+
MessageDeliveryType<ChangeOwnershipMessage>.Initialize();
54+
MessageDeliveryType<ClientConnectedMessage>.Initialize();
55+
MessageDeliveryType<ClientDisconnectedMessage>.Initialize();
56+
MessageDeliveryType<ConnectionRequestMessage>.Initialize();
57+
MessageDeliveryType<ConnectionApprovedMessage>.Initialize();
58+
MessageDeliveryType<CreateObjectMessage>.Initialize();
59+
MessageDeliveryType<DestroyObjectMessage>.Initialize();
60+
MessageDeliveryType<NetworkTransformMessage>.Initialize();
61+
MessageDeliveryType<NetworkVariableDeltaMessage>.Initialize();
62+
MessageDeliveryType<ParentSyncMessage>.Initialize();
63+
// RpcMessage.cs
64+
{
65+
MessageDeliveryType<RpcMessage>.Initialize();
66+
MessageDeliveryType<ClientRpcMessage>.Initialize();
67+
MessageDeliveryType<ServerRpcMessage>.Initialize();
68+
}
69+
MessageDeliveryType<SceneEventMessage>.Initialize();
70+
MessageDeliveryType<ServerLogMessage>.Initialize();
71+
MessageDeliveryType<SessionOwnerMessage>.Initialize();
72+
MessageDeliveryType<TimeSyncMessage>.Initialize();
4173
}
4274

4375
#if UNITY_EDITOR

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ChangeOwnershipMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ private bool HandleDAHostMessageForwarding(ref NetworkManager networkManager, ul
276276
ClientIdCount = 0,
277277
ChangeMessageType = ChangeMessageType,
278278
};
279-
var networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.ChangeOwnership);
279+
var networkDelivery = MessageDeliveryType<ChangeOwnershipMessage>.DefaultDelivery;
280280
if (ChangeMessageType == ChangeType.RequestDenied)
281281
{
282282
// If the local DAHost's client is not the target, then forward to the target

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/DestroyObjectMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ private void HandleDAHostForwardMessage(ulong senderId, ref NetworkManager netwo
192192
};
193193
var ownerClientId = networkObject == null ? senderId : networkObject.OwnerClientId;
194194
var clientIds = networkObject == null ? networkManager.ConnectionManager.ConnectedClientIds : networkObject.Observers.ToList();
195-
var networkDelivery = MessageDelivery.GetDelivery(NetworkMessageTypes.DestroyObject);
195+
var networkDelivery = MessageDeliveryType<DestroyObjectMessage>.DefaultDelivery;
196196
foreach (var clientId in clientIds)
197197
{
198198
if (clientId != networkManager.LocalClientId && clientId != ownerClientId)

0 commit comments

Comments
 (0)