# Simulation Frame

The simulation frame represents an internal clock that every Client syncs with a [Replication Server](https://docs.coherence.io/1.0/coherence-sdk-for-unity/replication-server). This clock runs at a 60Hz frequency which means that the resolution of a single simulation frame is \~16ms.

There are 3 different simulation frame types used within the **coherence**:

### Server simulation frame

The latest simulation frame received from the Replication Server. Accessible via `CoherenceBridge.NetworkTime.ServerSimulationFrame`.

### Client simulation frame

Local Client simulation frame that progresses with local time. Accessible via `CoherenceBridge.NetworkTime.ClientSimulationFrame`.

Every Client tries to match the Client simulation frame with the Server simulation frame by continuously monitoring the distance between the two and adjusting the `NetworkTime.NetworkTimeScale` based on the distance, ping, delta time, and several other factors starting from the first simulation frame captured when the client first connects in `NetworkTime.ConnectionSimulationFrame`

{% hint style="info" %}
The `Time.timeScale` is automatically set to the value of `NetworkTime.NetworkTimeScale` if the `CoherenceBridge.controlTimeScale` is set to true (default value).
{% endhint %}

![](https://352971571-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOnNWMLfYsbCzCnIbNrcP%2Fuploads%2F5P9MiKvALBW6ppAT7xhd%2FScreenshot%202023-04-25%20155033.png?alt=media\&token=f6e40052-546b-46ac-9d3b-e12cf1090ca5)

In perfect conditions, all Clients connected to a single session should have exactly the same `ClientSimulationFrame` value at any point in the real-world time.

{% hint style="warning" %}
The value of the `ClientSimulationFrame` can jump by more than 1 between two engine frames if the frame rate is low enough.
{% endhint %}

The Client simulation frame is used to timestamp any outgoing Entity changes to achieve a consistent view of the World for all players. The receiving side uses it for [interpolation](https://docs.coherence.io/1.0/coherence-sdk-for-unity/interpolation) of the synced values.

### Client fixed simulation frame

Local simulation frame that progresses in user-controlled fixed steps. Accessible via `CoherenceBridge.ClientFixedSimulationFrame`.

By default, the fixed step value is set to the `Time.fixedDeltaTime`.

Just like the basic Client simulation frame, it uses the `NetworkTime.NetworkTimeScale` to correct the drift. The fixed simulation frame is used as a base for the fixed-step, network-driven simulation loop that is run via `CoherenceBridge.OnFixedNetworkUpdate`. This loop is used internally to power the [`CoherenceInput`](https://docs.coherence.io/1.0/coherence-sdk-for-unity/authority-overview/input-queues) and the [GGPO](https://docs.coherence.io/1.0/coherence-sdk-for-unity/input-prediction-and-rollback) code.

{% hint style="info" %}
Unlike `ClientSimulationFrame` the `CoherenceBridge.OnFixedNetworkUpdate` loop never skips frames - it is guaranteed to run for every single frame increment.
{% endhint %}
