Attempt to improve time

This commit is contained in:
2026-01-01 21:49:12 +01:00
parent 69a0a752be
commit 26625f6b6f
12 changed files with 2302 additions and 1913 deletions

View File

@@ -1,4 +1,6 @@
using System;
using Cysharp.Threading.Tasks.Triggers;
using JetBrains.Annotations;
using System;
using System.Drawing;
using System.Text;
using UdonSharp;
@@ -46,8 +48,7 @@ namespace Marro.PacManUdon
private bool isSynced;
private long startTimeTicks = DateTime.UtcNow.Ticks; // Initialize to prevent errors
private uint nextEventTime;
private long nextEventTimeTicks;
private int retriesWithoutSuccess;
@@ -64,6 +65,8 @@ namespace Marro.PacManUdon
[UdonSynced] private byte[] networkedData = new byte[0];
public long CurrentTimeTicks { get; private set; }
public void Initialize()
{
if (!BitConverter.IsLittleEndian)
@@ -90,6 +93,8 @@ namespace Marro.PacManUdon
{
ProgressReplayTime();
}
UpdateTime(DateTime.UtcNow.Ticks);
}
public void SendEvent(NetworkEventType eventType)
@@ -100,13 +105,13 @@ namespace Marro.PacManUdon
return;
}
var eventTime = CurrentTime;
var eventTime = GetTimestamp(CurrentTimeTicks);
InitializeEvent(eventType, eventTime, BufferMaxSizeBytes, out byte[][] data, out var index);
foreach (var obj in syncedObjects)
{
obj.AppendSyncedData(data, ref index, eventType, eventTime);
obj.AppendSyncedData(data, ref index, eventType);
}
// Get event size, skipping over the event size which is not yet included
@@ -210,11 +215,11 @@ namespace Marro.PacManUdon
this.index = size;
// Sync up to the time in the full sync
var time = BitConverter.ToUInt32(networkedData, index + HeaderTimestampIndex);
SyncToTime(time);
var timestamp = BitConverter.ToUInt32(networkedData, index + HeaderTimestampIndex);
SyncToTimestamp(timestamp);
// Immediately apply the full sync
nextEventTime = time;
nextEventTimeTicks = GetTimeTicks(timestamp);
isSynced = true;
}
@@ -233,8 +238,7 @@ namespace Marro.PacManUdon
private void ProgressReplayTime()
{
var currentTime = CurrentTime;
while (index != 0 && nextEventTime <= currentTime)
while (index != 0 && nextEventTimeTicks <= CurrentTimeTicks)
{
ProcessIncomingEvent();
UpdateNextEventTime();
@@ -248,10 +252,10 @@ namespace Marro.PacManUdon
return;
}
var nextEventTime = BitConverter.ToUInt32(buffer, HeaderTimestampIndex);
if (nextEventTime >= this.nextEventTime)
var nextEventTimeTicks = GetTimeTicks(BitConverter.ToUInt32(buffer, HeaderTimestampIndex));
if (nextEventTimeTicks >= this.nextEventTimeTicks)
{
this.nextEventTime = nextEventTime;
this.nextEventTimeTicks = nextEventTimeTicks;
}
else
{
@@ -263,31 +267,31 @@ namespace Marro.PacManUdon
private void ProcessIncomingEvent()
{
var eventTime = BitConverter.ToUInt32(buffer, HeaderTimestampIndex);
var eventTimeTicks = GetTimeTicks(BitConverter.ToUInt32(buffer, HeaderTimestampIndex));
var eventType = (NetworkEventType)buffer[HeaderEventTypeIndex];
var index = (int)HeaderLength; // Skip header
if (false) // TODO: check event type
UpdateTime(eventTimeTicks);
foreach (var obj in syncedObjects)
{
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Invalid event type for incoming data! Buffer will be cleared.");
HandleError();
return;
obj.FixedUpdate();
}
foreach (var obj in syncedObjects)
{
var success = obj.SetSyncedData(buffer, ref index, eventType, eventTime);
var success = obj.SetSyncedData(buffer, ref index, eventType);
if (!success)
{
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Malformed data reported by {obj.name} during event type {eventType}! Resetting state.");
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Malformed data reported by {obj.name} during event type {eventType}!");
HandleError();
return;
}
if (index > this.index)
{
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Buffer overflow during SetSyncedData for {obj.name} in event type {eventType}! Resetting state.");
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Buffer overflow during {nameof(SyncedObject.SetSyncedData)} for {obj.name} in event type {eventType}!");
HandleError();
return;
}
@@ -308,10 +312,11 @@ namespace Marro.PacManUdon
retriesWithoutSuccess = 0; // We had success!
}
private void SyncToTime(uint newTime)
private void SyncToTimestamp(uint newTime)
{
var timeToSyncTo = newTime - Delay;
startTimeTicks = DateTime.UtcNow.Ticks - timeToSyncTo * TimeSpan.TicksPerMillisecond;
Debug.Log($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Synced to time {newTime}, startTimeTicks is now {startTimeTicks}");
}
@@ -483,12 +488,26 @@ namespace Marro.PacManUdon
}
}
public float GetDtInSeconds(uint currentTime, uint lastUpdate)
private void UpdateTime(long timeTicks)
{
return (CurrentTime - lastUpdate) / 1000f;
CurrentTimeTicks = timeTicks;
foreach (var obj in syncedObjects)
{
obj.Dt = (timeTicks - obj.LastUpdateTicks) / (float)TimeSpan.TicksPerSecond;
obj.LastUpdateTicks = timeTicks;
}
}
public uint CurrentTime => (uint)((DateTime.UtcNow.Ticks - startTimeTicks) / TimeSpan.TicksPerMillisecond);
public uint GetTimestamp(long timeTicks)
{
return (uint)((timeTicks - startTimeTicks) / TimeSpan.TicksPerMillisecond);
}
public long GetTimeTicks(uint timeStamp)
{
return timeStamp * TimeSpan.TicksPerMillisecond + startTimeTicks;
}
public bool IsOwner => isOwner;