# 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.coherence.io/1.1/coherence-sdk-for-unity/simulation-frame.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
