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
43 changes: 20 additions & 23 deletions LiteEntitySystem/ClientEntityManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public sealed class ClientEntityManager : EntityManager
/// Preferred input and incoming states buffer length in seconds lowest bound
/// Buffer automatically increases to Jitter time + PreferredBufferTimeLowest
/// </summary>
public float PreferredBufferTimeLowest = 0.01f;
public float PreferredBufferTimeLowest = 0.025f;

/// <summary>
/// Preferred input and incoming states buffer length in seconds lowest bound
Expand All @@ -122,6 +122,7 @@ public sealed class ClientEntityManager : EntityManager

private const float TimeSpeedChangeFadeTime = 0.1f;
private const float MaxJitter = 0.2f;
private const float MinJitter = 0.001f;

/// <summary>
/// Maximum stored inputs count
Expand Down Expand Up @@ -298,8 +299,8 @@ protected override unsafe void OnAliveEntityAdded(InternalEntity entity)
for (int i = 0; i < classData.InterpolatedCount; i++)
{
var field = classData.Fields[i];
field.TypeProcessor.WriteTo(entity, field.Offset, interpDataPtr + field.FixedOffset);
field.TypeProcessor.WriteTo(entity, field.Offset, prevDataPtr + field.FixedOffset);
field.TypeProcessor.WriteTo(entity, field.Offsets, interpDataPtr + field.FixedOffset);
field.TypeProcessor.WriteTo(entity, field.Offsets, prevDataPtr + field.FixedOffset);
}
}
}
Expand Down Expand Up @@ -449,8 +450,8 @@ private bool PreloadNextState()
//limit jitter for pause scenarios
if (NetworkJitter > MaxJitter)
NetworkJitter = MaxJitter;
float lowestBound = NetworkJitter + PreferredBufferTimeLowest;
float upperBound = NetworkJitter + PreferredBufferTimeHighest;
float lowestBound = NetworkJitter * 1.5f + PreferredBufferTimeLowest;
float upperBound = NetworkJitter * 1.5f + PreferredBufferTimeHighest;

//tune buffer playing speed
_lerpTime = Utils.SequenceDiff(_stateB.Tick, _stateA.Tick) * DeltaTimeF;
Expand Down Expand Up @@ -545,19 +546,11 @@ private unsafe void GoToNextState()
for (int i = 0; i < rollbackFields.Length; i++)
{
ref var field = ref rollbackFields[i];
if (field.FieldType == FieldType.SyncableSyncVar)
{
var syncableField = RefMagic.GetFieldValue<SyncableField>(entity, field.Offset);
field.TypeProcessor.SetFrom(syncableField, field.SyncableSyncVarOffset, predictedData + field.PredictedOffset);
}
else
{
field.TypeProcessor.SetFrom(entity, field.Offset, predictedData + field.PredictedOffset);
}
field.TypeProcessor.SetFrom(entity, field.Offsets, predictedData + field.PredictedOffset);
}
}
for (int i = 0; i < classData.SyncableFields.Length; i++)
RefMagic.GetFieldValue<SyncableField>(entity, classData.SyncableFields[i].Offset).OnRollback();
Utils.GetSyncableField(entity, classData.SyncableFields[i].Offsets).OnRollback();
entity.OnRollback();
}

Expand Down Expand Up @@ -593,7 +586,7 @@ private unsafe void GoToNextState()
fixed (byte* currentDataPtr = classData.ClientInterpolatedNextData(entity))
{
ref var field = ref classData.Fields[i];
field.TypeProcessor.WriteTo(entity, field.Offset, currentDataPtr + field.FixedOffset);
field.TypeProcessor.WriteTo(entity, field.Offsets, currentDataPtr + field.FixedOffset);
}
}
}
Expand Down Expand Up @@ -634,7 +627,7 @@ protected override unsafe void OnLogicTick()
for (int i = 0; i < classData.InterpolatedCount; i++)
{
ref var field = ref classData.Fields[i];
field.TypeProcessor.SetFrom(entity, field.Offset, currentDataPtr + field.FixedOffset);
field.TypeProcessor.SetFrom(entity, field.Offsets, currentDataPtr + field.FixedOffset);
}
}
}
Expand Down Expand Up @@ -679,7 +672,7 @@ protected override unsafe void OnLogicTick()
for(int i = 0; i < classData.InterpolatedCount; i++)
{
ref var field = ref classData.Fields[i];
field.TypeProcessor.WriteTo(entity, field.Offset, currentDataPtr + field.FixedOffset);
field.TypeProcessor.WriteTo(entity, field.Offsets, currentDataPtr + field.FixedOffset);
}
}
}
Expand All @@ -692,7 +685,11 @@ protected override unsafe void OnLogicTick()
}

if (NetworkJitter > _jitterMiddle)
{
NetworkJitter -= DeltaTimeF * 0.1f;
if (NetworkJitter < MinJitter)
NetworkJitter = MinJitter;
}
}

/// <summary>
Expand Down Expand Up @@ -745,7 +742,7 @@ public override unsafe void Update()
ref var field = ref classData.Fields[i];
field.TypeProcessor.SetInterpolation(
entity,
field.Offset,
field.Offsets,
prevDataPtr + field.FixedOffset,
currentDataPtr + field.FixedOffset,
localLerpT);
Expand Down Expand Up @@ -915,22 +912,22 @@ private unsafe void ExecuteSyncCallsAndWriteHistory(ServerStateData stateData)
fixed (byte* prevDataPtr = classData.ClientInterpolatedPrevData(e))
{
ref var field = ref classData.Fields[i];
field.TypeProcessor.WriteTo(e, field.Offset, prevDataPtr + field.FixedOffset);
field.TypeProcessor.WriteTo(e, field.Offsets, prevDataPtr + field.FixedOffset);
}
}
e.Update();
e.SafeUpdate();
for (int i = 0; i < classData.InterpolatedCount; i++)
{
fixed (byte* currentDataPtr = classData.ClientInterpolatedNextData(e))
{
ref var field = ref classData.Fields[i];
field.TypeProcessor.WriteTo(e, field.Offset, currentDataPtr + field.FixedOffset);
field.TypeProcessor.WriteTo(e, field.Offsets, currentDataPtr + field.FixedOffset);
}
}
}
else
{
e.Update();
e.SafeUpdate();
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion LiteEntitySystem/EntityManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ public void GetEntitySyncVarInfo(InternalEntity entity, IEntitySyncVarInfoPrinte
{
ref var classData = ref ClassDataDict[entity.ClassId];
foreach (EntityFieldInfo fi in classData.Fields)
resultPrinter.PrintFieldInfo(fi.Name, fi.TypeProcessor.ToString(entity, fi.Offset));
resultPrinter.PrintFieldInfo(fi.Name, fi.TypeProcessor.ToString(entity, fi.Offsets));
}

/// <summary>
Expand Down
38 changes: 35 additions & 3 deletions LiteEntitySystem/Extensions/NetDataExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,38 @@ namespace LiteNetLib.Utils
{
public static class NetDataExtensions
{
/// <summary>
/// Writes the raw bytes of any unmanaged T.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe void PutUnmanaged<T>(this NetDataWriter writer, T value)
where T : unmanaged
{
int size = sizeof(T);
var buf = new byte[size];
fixed (byte* dst = buf)
{
Buffer.MemoryCopy(&value, dst, size, size);
}
writer.Put(buf, 0, size);
}

/// <summary>
/// Reads sizeof(T) bytes into a temporary buffer and reinterprets them as T.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe T GetUnmanaged<T>(this NetDataReader reader)
where T : unmanaged
{
int size = sizeof(T);
var buf = new byte[size];
reader.GetBytes(buf, 0, size);
fixed (byte* src = buf)
{
return *(T*)src;
}
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe void Put<T>(this NetDataWriter writer, T e) where T : unmanaged, Enum
{
Expand All @@ -19,7 +51,7 @@ public static unsafe void Put<T>(this NetDataWriter writer, T e) where T : unman
case 8: writer.Put(*(long*)&e); break;
}
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe void Get<T>(this NetDataReader reader, out T result) where T : unmanaged, Enum
{
Expand All @@ -33,7 +65,7 @@ public static unsafe void Get<T>(this NetDataReader reader, out T result) where
}
result = e;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe T Get<T>(this NetDataReader reader) where T : unmanaged, Enum
{
Expand All @@ -47,7 +79,7 @@ public static unsafe T Get<T>(this NetDataReader reader) where T : unmanaged, En
}
return e;
}

#if UNITY_2021_2_OR_NEWER
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Put(this NetDataWriter writer, Vector3 v)
Expand Down
Binary file modified LiteEntitySystem/ILPart/RefMagic.dll
Binary file not shown.
16 changes: 8 additions & 8 deletions LiteEntitySystem/ILPart/RefMagic.il
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
.module RefMagic.dll

.class interface public abstract auto ansi beforefieldinit LiteEntitySystem.Internal.ISyncVar`1<
valuetype .ctor (class System.ValueType modreq ([netstandard]System.Runtime.InteropServices.UnmanagedType)) T>
valuetype .ctor (class [netstandard]System.ValueType modreq([netstandard]System.Runtime.InteropServices.UnmanagedType)) T>
{
.param type T
.custom instance void [netstandard]System.Runtime.CompilerServices.IsUnmanagedAttribute::.ctor() = (01 00 00 00 )
Expand All @@ -36,7 +36,7 @@
.method public hidebysig virtual newslot abstract instance bool SvSetFromAndSync(!T& 'value') cil managed {}
}

.class public abstract auto ansi sealed beforefieldinit LiteEntitySystem.Internal.RefMagic extends object
.class public abstract auto ansi sealed beforefieldinit LiteEntitySystem.Internal.RefMagic extends [netstandard]System.Object
{
.method public hidebysig static !!T GetFieldValue<T>(object obj, int32 offs) cil managed aggressiveinlining
{
Expand All @@ -60,8 +60,8 @@
}

.method public hidebysig static void SyncVarSetDirect<
valuetype .ctor (class System.ValueType modreq ([netstandard]System.Runtime.InteropServices.UnmanagedType)) T,
valuetype .ctor (class LiteEntitySystem.Internal.ISyncVar`1<!!T>, class System.ValueType) TSyncVar>
valuetype .ctor (class [netstandard]System.ValueType modreq ([netstandard]System.Runtime.InteropServices.UnmanagedType)) T,
valuetype .ctor (class LiteEntitySystem.Internal.ISyncVar`1<!!T>, class [netstandard]System.ValueType) TSyncVar>
(object obj, int32 offs, !!T 'value') cil managed aggressiveinlining
{
.param type T
Expand All @@ -78,8 +78,8 @@
}

.method public hidebysig static void SyncVarSetDirectAndStorePrev<
valuetype .ctor (class System.ValueType modreq([netstandard]System.Runtime.InteropServices.UnmanagedType)) T,
valuetype .ctor (class LiteEntitySystem.Internal.ISyncVar`1<!!T>, System.ValueType) TSyncVar>
valuetype .ctor (class [netstandard]System.ValueType modreq([netstandard]System.Runtime.InteropServices.UnmanagedType)) T,
valuetype .ctor (class LiteEntitySystem.Internal.ISyncVar`1<!!T>, [netstandard]System.ValueType) TSyncVar>
(object obj, int32 offs, !!T 'value', [out] !!T& prevValue) cil managed aggressiveinlining
{
.param type T
Expand All @@ -97,8 +97,8 @@
}

.method public hidebysig static bool SyncVarSetFromAndSync<
valuetype .ctor (class System.ValueType modreq([netstandard]System.Runtime.InteropServices.UnmanagedType)) T,
valuetype .ctor (class LiteEntitySystem.Internal.ISyncVar`1<!!T>, System.ValueType) TSyncVar>
valuetype .ctor (class [netstandard]System.ValueType modreq([netstandard]System.Runtime.InteropServices.UnmanagedType)) T,
valuetype .ctor (class LiteEntitySystem.Internal.ISyncVar`1<!!T>, [netstandard]System.ValueType) TSyncVar>
(object obj, int32 offs, !!T& 'value') cil managed aggressiveinlining
{
.param type T
Expand Down
Loading