---
name: "onEachFrame"
type: command
status: ok
groups: ["Event Handlers"]
arma3_since: "0.50"
locality: {"argument": null, "effect": null, "server_exec": false}
source: https://community.bistudio.com/wiki/onEachFrame
revid: 369525
updated: 2024-09-15T18:15:30Z
---

# onEachFrame

*Command · Event Handlers · Arma 3 v0.50 · introduced in Arma 2: Operation Arrowhead v1.63*

## Description

Runs given statement every frame in an [unscheduled environment](../topics/Scheduler.md#unscheduled-environment).

> [!NOTE]
> **Arma 3:** In order to keep compatibility between official and community content:
> - Since Arma 3 v1.58 a stackable version of this EH is available: [EachFrame Mission Event Handler](../topics/Mission_Event_Handlers.md#eachframe)
> - Before that, the scripted version of the event handler should be used instead (using [BIS_fnc_addStackedEventHandler](../functions/BIS_fnc_addStackedEventHandler.md) and [BIS_fnc_removeStackedEventHandler](../functions/BIS_fnc_removeStackedEventHandler.md)).

## Syntax

```sqf
onEachFrame statement
```

**Parameters:**

- `statement`: [String](../topics/String.md) or [Code](../topics/Code.md)

**Returns:** [Nothing](../topics/Nothing.md)

## Examples

### Example 1

```sqf
onEachFrame { hintSilent str getPosWorld player }; // hints position every frame
```

### Example 2

Private variables defined outside of the [onEachFrame](../commands/onEachFrame.md) scope are not inherited:

```sqf
_myVar = "bob";
MyVar = "bill";
onEachFrame { hintSilent str [_myVar, MyVar]; };
// Result: [any, "bill"]
```

### Example 3

Only one [onEachFrame](../commands/onEachFrame.md) loop can exist at any time:

```sqf
onEachFrame { player sideChat "first"; };
onEachFrame { player sideChat "second"; };    // replaces the first one
onEachFrame {};                                // reset to the initial state
```

### Example 4

Script suspension is not permitted within [onEachFrame](../commands/onEachFrame.md) scope:

```sqf
// will throw an error
onEachFrame { sleep 1; };
```

### Example 5

```sqf
onEachFrame { if (diag_frameNo mod 60 isEqualTo 0) then { /* code */ } };    // executes every 60 frames (every second @ 60 FPS, every two seconds @ 30 FPS, etc)

onEachFrame {                                                                // this version is the closest to a precise 1 second tick
    if (isNil "TAG_LastHint") then
    {
        TAG_LastHint = diag_tickTime;
    }
    else
    {
        if (diag_tickTime - TAG_LastHint >= 1) then // set the duration in seconds here
        {
            hint format ["a second has passed (%1s since game start)", diag_tickTime];
            TAG_LastHint = diag_tickTime;
        };
    };
};
```

## See also

[diag_frameNo](../commands/diag_frameNo.md) · [diag_fps](../commands/diag_fps.md)

<sub>Source: [BI Community Wiki — onEachFrame](https://community.bistudio.com/wiki/onEachFrame) (revision 369525).</sub>
