Switched to 1d array CollectSyncedData

This commit is contained in:
2026-01-17 19:25:45 +01:00
parent 3642006bb2
commit b68b3d1c25
16 changed files with 216 additions and 78 deletions

View File

@@ -64,6 +64,10 @@ namespace Marro.PacManUdon
/// The maximum amount of events in the buffer.
/// </summary>
private const int BufferMaxTotalEvents = 255;
/// <summary>
/// The maximum amount of events in the buffer.
/// </summary>
private const int MaxEventSize = ushort.MaxValue;
/// <summary>
/// The index in an event where the event size is stored.
@@ -396,36 +400,27 @@ namespace Marro.PacManUdon
var eventId = GetNextEventId(lastEventId);
InitializeEvent(eventType, timestamp, eventId, BufferMaxTotalEvents, out byte[][] data, out var index);
InitializeEvent(eventType, timestamp, eventId, out byte[] data, out var index);
foreach (var obj in syncedObjects)
{
obj.AppendSyncedData(data, ref index, eventType);
obj.CollectSyncedData(data, ref index, eventType);
}
var result = Flatten(data, 0, index);
// Validate and fill in event size
var eventSize = result.Length;
if (eventSize > ushort.MaxValue || eventSize < 0)
{
Debug.LogError($"({nameof(PacManUdon)} {nameof(NetworkManager)}) New event is too large or negative! Size is {eventSize}, maximum allowed is {ushort.MaxValue}");
HandleError(false);
return;
}
var eventSizeBytes = BitConverter.GetBytes((ushort)eventSize);
Array.Copy(eventSizeBytes, 0, result, HeaderEventSizeIndex, eventSizeBytes.Length);
var eventSizeBytes = BitConverter.GetBytes((ushort)index);
Array.Copy(eventSizeBytes, 0, data, HeaderEventSizeIndex, eventSizeBytes.Length);
if (IsFullSync(eventType))
{
hasFullSyncReady = true;
}
QueueEventInBuffer(result);
data = GetArrayPart(data, 0, index);
Debug.Log($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Prepared event of type {eventType} with {eventSize} bytes, timestamp {timestamp} and id {eventId} for serialization.");
QueueEventInBuffer(data);
Debug.Log($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Prepared event of type {eventType} with {data.Length} bytes, timestamp {timestamp} and id {eventId} for serialization.");
RequestSerializationForEvents();
@@ -434,22 +429,16 @@ namespace Marro.PacManUdon
retriesWithoutSuccess = 0; // We had success!
}
private static void InitializeEvent(NetworkEventType eventType, float timestamp, byte eventId, int maxSize, out byte[][] data, out int index)
private static void InitializeEvent(NetworkEventType eventType, float timestamp, byte eventId, out byte[] data, out int index)
{
// Create header
data = new byte[MaxEventSize];
// Create header (note: event size is added later)
var timestampBytes = BitConverter.GetBytes(timestamp);
var header = new byte[HeaderLength];
// Event size is added later
Array.Copy(timestampBytes, 0, header, HeaderTimestampIndex, timestampBytes.Length);
header[HeaderEventIdIndex] = eventId;
header[HeaderEventTypeIndex] = Int32ToByte((int)eventType);
// Initialize event container
data = new byte[maxSize][];
data[0] = header;
index = 1;
Array.Copy(timestampBytes, 0, data, HeaderTimestampIndex, timestampBytes.Length);
data[HeaderEventIdIndex] = eventId;
data[HeaderEventTypeIndex] = Int32ToByte((int)eventType);
index = HeaderLength;
}
private void RequestSerializationForEvents()
@@ -696,7 +685,7 @@ namespace Marro.PacManUdon
foreach (var obj in syncedObjects)
{
var success = obj.SetSyncedData(@event, ref index, eventType);
var success = obj.WriteSyncedData(@event, ref index, eventType);
if (!success)
{