Struct NetworkTimeSystem
System responsible for estimating the ServerTick and InterpolationTick using the current round trip time (see NetworkSnapshotAck) and feedback from the server (see ServerCommandAge).
The system tries to keep the server tick (present on the client) ahead of the server, such that input commands (see ICommandData and IInputComponentData) are received before the server needs them for the simulation. The system speeds up and slows down the client simulation elapsed delta time to compensate for changes in the network condition, and makes the reported ServerCommandAge close to the TargetCommandSlack.
This time synchronization start taking place as soon as the first snapshot is received by the client. Because of that, until the client NetworkStreamConnection is not set in-game (see NetworkStreamInGame), the calculated server tick and interpolated are always 0.
In the case where the client and server world are on the same process, and an IPC connection is used (see IPC), some special optimizations can be applied. E.g. In this case the client should always run 1 tick per frame (server and client update in tandem).
Implements
Inherited Members
Namespace: Unity.NetCode
Assembly: Unity.NetCode.dll
Syntax
[BurstCompile]
[WorldSystemFilter(WorldSystemFilterFlags.ClientSimulation|WorldSystemFilterFlags.ThinClientSimulation, WorldSystemFilterFlags.Default)]
[UpdateInGroup(typeof(InitializationSystemGroup))]
[UpdateAfter(typeof(UpdateWorldTimeSystem))]
public struct NetworkTimeSystem : ISystem, ISystemStartStop, ISystemCompilerGenerated
Properties
DefaultClientTickRate
A new ClientTickRate instance initialized with good and sensible default values.
Declaration
public static ClientTickRate DefaultClientTickRate { get; }
Property Value
| Type | Description |
|---|---|
| ClientTickRate |
TimestampMS
Return a low precision real-time stamp that represents the number of milliseconds since the process started. In Development build and Editor, the maximum reported delta in between two calls of the TimestampMS is capped to 100 milliseconds.
Declaration
public static uint TimestampMS { get; }
Property Value
| Type | Description |
|---|---|
| uint |
Remarks
The TimestampMS is mostly used for sake of time synchronization (for calculting the RTT).
Methods
OnCreate(ref SystemState)
Create the NetworkTimeSystemData singleton and reset the initial system state.
Declaration
[BurstCompile]
public void OnCreate(ref SystemState state)
Parameters
| Type | Name | Description |
|---|---|---|
| SystemState | state | The Unity.Entities.SystemState backing this system instance |
Remarks
Implement an OnCreate function to set up system resources when it is created.
OnCreate is invoked before the the first time Unity.Entities.ISystemStartStop.OnStartRunning(ref Unity.Entities.SystemState)
and Unity.Entities.ISystem.OnUpdate(ref Unity.Entities.SystemState) are invoked.
OnCreateForCompiler(ref SystemState)
Generated by compilation pipeline and used internally.
Declaration
public void OnCreateForCompiler(ref SystemState state)
Parameters
| Type | Name | Description |
|---|---|---|
| SystemState | state | The Unity.Entities.SystemState backing this system instance |
OnStartRunning(ref SystemState)
Empty method, implement the Unity.Entities.ISystem interface.
Declaration
[BurstCompile]
public void OnStartRunning(ref SystemState state)
Parameters
| Type | Name | Description |
|---|---|---|
| SystemState | state | The Unity.Entities.SystemState backing this system instance |
Remarks
If the Unity.Entities.EntityQuery objects defined for a system do not match any existing entities then the system skips updates until a successful match is found. Likewise, if you set Unity.Entities.SystemState.Enabled to false, then the system stops running. In both cases, Unity.Entities.ISystemStartStop.OnStopRunning(ref Unity.Entities.SystemState) is called when a running system stops updating; OnStartRunning is called when it starts updating again.
OnStopRunning(ref SystemState)
Reset the NetworkTimeSystemData data and some internal variables.
Declaration
[BurstCompile]
public void OnStopRunning(ref SystemState state)
Parameters
| Type | Name | Description |
|---|---|---|
| SystemState | state | The Unity.Entities.SystemState backing this system instance |
Remarks
If the Unity.Entities.EntityQuery objects defined for a system do not match any existing entities then the system skips updating until a successful match is found. Likewise, if you set Unity.Entities.SystemState.Enabled to false, then the system stops running. In both cases, OnStopRunning is called when a running system stops updating; Unity.Entities.ISystemStartStop.OnStartRunning(ref Unity.Entities.SystemState) is called when it starts updating again.
OnUpdate(ref SystemState)
Implements all the time synchronization logic on the main thread.
Declaration
[BurstCompile]
public void OnUpdate(ref SystemState state)
Parameters
| Type | Name | Description |
|---|---|---|
| SystemState | state | The Unity.Entities.SystemState backing this system instance |
Remarks
By default, the system invokes `OnUpdate` once every frame on the main thread. To skip OnUpdate if all of the system's [EntityQueries] are empty, use the [RequireMatchingQueriesForUpdateAttribute]. To limit when OnUpdate is invoked, you can specify components that must exist, or queries that match specific Entities. To do this, call Unity.Entities.SystemState.RequireForUpdate<T>() or Unity.Entities.SystemState.RequireForUpdate(Unity.Entities.EntityQuery) in the system's OnCreate method. For more information, see Unity.Entities.SystemState.ShouldRunSystem().
You can instantiate and schedule an Unity.Entities.IJobChunk instance; you can use the [C# Job System] or you can perform work on the main thread. If you call Unity.Entities.EntityManager methods that perform structural changes on the main thread, be sure to arrange the system order to minimize the performance impact of the resulting [sync points].
[sync points]: xref:concepts-structural-changes
[C# Job System]: https://docs.unity3d.com/Manual/JobSystem.html
[EntityQueries]: xref:Unity.Entities.EntityQuery
[RequireMatchingQueriesForUpdateAttribute]: xref:Unity.Entities.RequireMatchingQueriesForUpdateAttribute
ResetFixedTime()
Fixes any stray FixedTime values when domain reloads are disabled.
Declaration
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
public static void ResetFixedTime()