# Simulation Frame

The simulation frame represents an internal clock that every Client syncs with a [Replication Server](https://docs.coherence.io/1.1/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**:

### Simulation Frame

Accessible via [`CoherenceBridge.NetworkTime`](https://unityapi.coherence.io/docs/api/Coherence.Toolkit.CoherenceBridge.html#Coherence_Toolkit_CoherenceBridge_NetworkTime).

```csharp
void Start()
{
    if (!CoherenceBridgeStore.TryGetBridge(gameObject.scene, out var bridge))
    {
        Debug.LogWarning("Couldn't find CoherenceBridge in the scene.");
        return;
    }
    
    var networkTime = bridge.NetworkTime;

    var serverFrame = networkTime.ServerSimulationFrame.Frame;
    Debug.Log("Server Simulation Frame: " + serverFrame);
    
    var clientFrame = networkTime.ClientSimulationFrame.Frame;
    Debug.Log("Client Simulation Frame: " + clientFrame);
}
```

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`](https://unityapi.coherence.io/docs/api/Coherence.Core.NetworkTime.html#Coherence_Core_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`](https://unityapi.coherence.io/docs/api/Coherence.Core.NetworkTime.html#Coherence_Core_NetworkTime_ConnectionSimulationFrame)

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

![](https://content.gitbook.com/content/4xmLLczbgaGVeoF6vews/blobs/7PsUwJqCGh1KHchw0Pp8/Screenshot%202023-04-25%20155033.png)

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.1/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`](https://unityapi.coherence.io/docs/api/Coherence.Core.NetworkTime.html#Coherence_Core_NetworkTime_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`](https://unityapi.coherence.io/docs/api/Coherence.Core.NetworkTime.html#Coherence_Core_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`](https://unityapi.coherence.io/docs/api/Coherence.Core.NetworkTime.html#Coherence_Core_NetworkTime_OnFixedNetworkUpdate). This loop is used internally to power the [`CoherenceInput`](https://docs.coherence.io/1.1/coherence-sdk-for-unity/authority-overview/input-queues) and the [GGPO](https://docs.coherence.io/1.1/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 %}
