Skip to content

Commit a6b9932

Browse files
committed
feat: reduce GC.Alloc()
1 parent 6d059f7 commit a6b9932

1 file changed

Lines changed: 35 additions & 12 deletions

File tree

Scripts/GameApi/LiteNetLibTransform.cs

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,29 @@ public Vector3 GetScale(Vector3 defaultScale)
139139
}
140140
}
141141

142+
public class SyncTransforms : SortedList<uint, TransformData>, INetSerializable
143+
{
144+
public void Serialize(NetDataWriter writer)
145+
{
146+
writer.Put(Count);
147+
foreach (var entry in this)
148+
{
149+
entry.Value.Serialize(writer);
150+
}
151+
}
152+
153+
public void Deserialize(NetDataReader reader)
154+
{
155+
Clear();
156+
int count = reader.GetInt();
157+
for (int i = 0; i < count; ++i)
158+
{
159+
TransformData entry = reader.Get<TransformData>();
160+
Add(entry.Tick, entry);
161+
}
162+
}
163+
}
164+
142165
[Header("Sync Settings")]
143166
[Tooltip("If this is TRUE, transform data will be sent from owner client to server to update to another clients")]
144167
[FormerlySerializedAs("ownerClientCanSendTransform")]
@@ -172,7 +195,7 @@ public Vector3 GetScale(Vector3 defaultScale)
172195
private float _startInterpTime;
173196
private float _endInterpTime;
174197

175-
private SortedList<uint, TransformData> _syncBuffers = new SortedList<uint, TransformData>();
198+
private SyncTransforms _syncBuffers = new SyncTransforms();
176199
private SortedList<uint, TransformData> _interpBuffers = new SortedList<uint, TransformData>();
177200

178201
private LogicUpdater _logicUpdater = null;
@@ -257,17 +280,17 @@ private void LogicUpdater_OnTick(LogicUpdater updater)
257280
if (!syncByOwnerClient && IsServer)
258281
{
259282
StoreSyncBuffer(transformData);
260-
RPC(ServerSyncTransform, 0, LiteNetLib.DeliveryMethod.Unreliable, _syncBuffers.Values.ToArray());
283+
RPC(ServerSyncTransform, 0, LiteNetLib.DeliveryMethod.Unreliable, _syncBuffers);
261284
}
262285
else if (syncByOwnerClient && IsOwnedByServer)
263286
{
264287
StoreSyncBuffer(transformData);
265-
RPC(ServerSyncTransform, 0, LiteNetLib.DeliveryMethod.Unreliable, _syncBuffers.Values.ToArray());
288+
RPC(ServerSyncTransform, 0, LiteNetLib.DeliveryMethod.Unreliable, _syncBuffers);
266289
}
267290
else if (syncByOwnerClient && IsOwnerClient)
268291
{
269292
StoreSyncBuffer(transformData);
270-
RPC(OwnerSyncTransform, 0, LiteNetLib.DeliveryMethod.Unreliable, _syncBuffers.Values.ToArray());
293+
RPC(OwnerSyncTransform, 0, LiteNetLib.DeliveryMethod.Unreliable, _syncBuffers);
271294
}
272295
}
273296

@@ -355,7 +378,7 @@ private void InterpolateTransform()
355378
}
356379

357380
[ServerRpc]
358-
private void OwnerSyncTransform(TransformData[] data)
381+
private void OwnerSyncTransform(SyncTransforms data)
359382
{
360383
if (!syncByOwnerClient && IsServer)
361384
return;
@@ -375,7 +398,7 @@ private void OwnerSyncTransform(TransformData[] data)
375398
}
376399

377400
[AllRpc]
378-
private void ServerSyncTransform(TransformData[] data)
401+
private void ServerSyncTransform(SyncTransforms data)
379402
{
380403
if (IsServer)
381404
return;
@@ -393,18 +416,18 @@ private void ServerSyncTransform(TransformData[] data)
393416
}
394417
}
395418

396-
private void StoreInterpolateBuffers(TransformData[] data, int maxBuffers = 3)
419+
private void StoreInterpolateBuffers(SyncTransforms data, int maxBuffers = 3)
397420
{
398421
foreach (var entry in data)
399422
{
400-
if (_interpBuffers.ContainsKey(entry.Tick))
423+
if (_interpBuffers.ContainsKey(entry.Key))
401424
continue;
402-
if (entry.Extra != null)
425+
if (entry.Value.Extra != null)
403426
{
404-
s_ExtraReader.SetSource(entry.Extra);
405-
onReadInterpBuffer?.Invoke(s_ExtraReader, entry.Tick);
427+
s_ExtraReader.SetSource(entry.Value.Extra);
428+
onReadInterpBuffer?.Invoke(s_ExtraReader, entry.Key);
406429
}
407-
_interpBuffers.Add(entry.Tick, entry);
430+
_interpBuffers.Add(entry.Key, entry.Value);
408431
}
409432
// Prune old ticks (keep last N)
410433
while (_interpBuffers.Count > maxBuffers)

0 commit comments

Comments
 (0)