Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
15 changes: 11 additions & 4 deletions Assets/Mirror/Core/NetworkBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -766,6 +766,13 @@ public static bool SyncVarNetworkIdentityEqual(NetworkIdentity newIdentity, uint
return newNetId == netIdField;
}

// Anonymous method instance is instantiated upon entering the method containing it.
// Deferred hooks should only be added in a nested method to avoid allocations when not adding a deferred hook.
void AddDeferredSyncVarHook<T>(Action<T, T> hook, T capturedPrevious, T capturedNew)
{
deferredSyncVarHooks.Add(() => hook(capturedPrevious, capturedNew));
}

// move the [SyncVar] generated OnDeserialize C# to avoid much IL.
//
// before:
Expand Down Expand Up @@ -832,7 +839,7 @@ public void GeneratedSyncVarDeserialize<T>(ref T field, Action<T, T> OnChanged,
// Capture values in closure for deferred execution
T capturedPrevious = previous;
T capturedNew = field;
deferredSyncVarHooks.Add(() => OnChanged(capturedPrevious, capturedNew));
AddDeferredSyncVarHook(OnChanged, capturedPrevious, capturedNew);
}
else
{
Expand Down Expand Up @@ -910,7 +917,7 @@ public void GeneratedSyncVarDeserialize_GameObject(ref GameObject field, Action<
{
GameObject capturedPrevious = previousGameObject;
GameObject capturedNew = field;
deferredSyncVarHooks.Add(() => OnChanged(capturedPrevious, capturedNew));
AddDeferredSyncVarHook(OnChanged, capturedPrevious, capturedNew);
}
else
{
Expand Down Expand Up @@ -988,7 +995,7 @@ public void GeneratedSyncVarDeserialize_NetworkIdentity(ref NetworkIdentity fiel
{
NetworkIdentity capturedPrevious = previousIdentity;
NetworkIdentity capturedNew = field;
deferredSyncVarHooks.Add(() => OnChanged(capturedPrevious, capturedNew));
AddDeferredSyncVarHook(OnChanged, capturedPrevious, capturedNew);
}
else
{
Expand Down Expand Up @@ -1068,7 +1075,7 @@ public void GeneratedSyncVarDeserialize_NetworkBehaviour<T>(ref T field, Action<
{
T capturedPrevious = previousBehaviour;
T capturedNew = field;
deferredSyncVarHooks.Add(() => OnChanged(capturedPrevious, capturedNew));
AddDeferredSyncVarHook(OnChanged, capturedPrevious, capturedNew);
}
else
{
Expand Down
10 changes: 7 additions & 3 deletions Assets/Mirror/Core/SyncDictionary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -378,9 +378,7 @@ void AddOperation(Operation op, TKey key, TValue item, TValue oldItem, bool chec
TKey capturedKey = key;
TValue capturedItem = item;
TValue capturedOld = oldItem;

networkBehaviour.deferredSyncCollectionActions.Add(() =>
InvokeActions(capturedOp, capturedKey, capturedItem, capturedOld));
AddDeferredOperation(capturedOp, capturedKey, capturedItem, capturedOld);
}
else
{
Expand All @@ -390,6 +388,12 @@ void AddOperation(Operation op, TKey key, TValue item, TValue oldItem, bool chec
}
}

void AddDeferredOperation(Operation capturedOp, TKey capturedKey, TValue capturedItem, TValue capturedOld)
{
networkBehaviour.deferredSyncCollectionActions.Add(() =>
InvokeActions(capturedOp, capturedKey, capturedItem, capturedOld));
}

void InvokeActions(Operation op, TKey key, TValue item, TValue oldItem)
{
switch (op)
Expand Down
10 changes: 7 additions & 3 deletions Assets/Mirror/Core/SyncList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,7 @@ void AddOperation(Operation op, int itemIndex, T oldItem, T newItem, bool checkA
int capturedIndex = itemIndex;
T capturedOld = oldItem;
T capturedNew = newItem;

networkBehaviour.deferredSyncCollectionActions.Add(() =>
InvokeActions(capturedOp, capturedIndex, capturedOld, capturedNew));
AddDeferredOperation(capturedOp, capturedIndex, capturedOld, capturedNew);
}
else
{
Expand All @@ -151,6 +149,12 @@ void AddOperation(Operation op, int itemIndex, T oldItem, T newItem, bool checkA
}
}

void AddDeferredOperation(Operation capturedOp, int capturedIndex, T capturedOld, T capturedNew)
{
networkBehaviour.deferredSyncCollectionActions.Add(() =>
InvokeActions(capturedOp, capturedIndex, capturedOld, capturedNew));
}

void InvokeActions(Operation op, int itemIndex, T oldItem, T newItem)
{
switch (op)
Expand Down
10 changes: 7 additions & 3 deletions Assets/Mirror/Core/SyncSet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,7 @@ void AddOperation(Operation op, T oldItem, T newItem, bool checkAccess, bool sho
Operation capturedOp = op;
T capturedOld = oldItem;
T capturedNew = newItem;

networkBehaviour.deferredSyncCollectionActions.Add(() =>
InvokeActions(capturedOp, capturedOld, capturedNew));
AddDeferredOperation(capturedOp, capturedOld, capturedNew);
}
else
{
Expand All @@ -142,6 +140,12 @@ void AddOperation(Operation op, T oldItem, T newItem, bool checkAccess, bool sho
}
}

void AddDeferredOperation(Operation capturedOp, T capturedOld, T capturedNew)
{
networkBehaviour.deferredSyncCollectionActions.Add(() =>
InvokeActions(capturedOp, capturedOld, capturedNew));
}

void AddOperation(Operation op, bool checkAccess) => AddOperation(op, default, default, checkAccess, true);

void InvokeActions(Operation op, T oldItem, T newItem)
Expand Down
Loading