Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Fixing jitter, stutter and input lag

What is jitter, stutter and input lag?

Les jitter et stutter sont deux altérations différentes du mouvement des objets visibles à l'écran qui peuvent affecter un jeu, même lors de l'exécution à pleine vitesse. Ces effets sont surtout visibles dans les jeux où l'environnement se déplace à une vitesse constante dans une direction fixe, comme les runners ou les jeux de plateformes.

Input lag is unrelated to jitter and stutter, but is sometimes discussed alongside. Input lag refers to visible on-screen delay when performing actions with the mouse, keyboard, controller or touchscreen. It can be related to game code, engine code or external factors (such as hardware). Input lag is most noticeable in games that use the mouse to aim, such as first-person games. Input lag can't be completely eliminated, but it can be reduced in several ways.

Distinguishing between jitter and stutter

Un jeu s'exécutant à une fréquence d'images normale n'affichant aucun effet apparaîtra fluide :

../../_images/motion_normal.gif

Un jeu présentant des jitter tremblera constamment d'une manière très subtile :

../../_images/motion_jitter.gif

Enfin, un jeu présentant des stutter apparaîtra fluide, mais semblera s'arrêter ou revenir une image en arrière sur plusieurs secondes :

../../_images/motion_stutter.gif

Jitter

Il peut y avoir de nombreuses causes de jitter, la plus typique se produit lorsque la fréquence physique du jeu (généralement 60 Hz) fonctionne à une résolution différente de la fréquence de rafraîchissement de l'écran. Vérifiez si la fréquence de rafraîchissement de votre écran est différente de 60 Hz.

Ce n'est généralement pas un problème, étant donné que la plupart des moniteurs sont à 60 Hz, et à partir de Godot 3.1, une horloge d'image(frame) a été introduit qui essaie de se synchroniser au mieux avec le rafraîchissement.

Sometimes only some objects appear to jitter (character or background). This happens when they are processed in different time sources (one is processed in the physics step while another is processed in the idle step). Godot 3.1 does some improvements to this, from allowing kinematic bodies to be animated in the regular _process() loop, to further fixes in the frame timer.

Note

You can use physics interpolation to mitigate physics-related jittering. See lawnjelly's smoothing-addon for an add-on that can be dropped into any project to enable physics interpolation.

Stutter

Des stutter peuvent se produire pour deux raisons différentes. Le premier, et le plus évident, est que le jeu ne peut pas maintenir complètement le taux de rafraîchissement des images. La résolution de ce problème est spécifique au jeu et nécessitera de l'optimisation.

La seconde est plus compliquée, car elle n'est souvent pas associée au moteur ou au jeu mais au système d'exploitation sous-jacent. Voici quelques informations concernant les stutter sur différents systèmes d'exploitation.

On platforms that support disabling V-Sync, stuttering can be made less noticeable by disabling V-Sync in the project settings. This will however cause tearing to appear, especially on monitors with low refresh rates. If your monitor supports it, consider enabling variable refresh rate (G-Sync/FreeSync) while leaving V-Sync enabled. This avoids mitigating some forms of stuttering without introducing tearing.

Forcing your graphics card to use the maximum performance profile can also help reduce stuttering, at the cost of increased GPU power draw.

Windows

Windows est connu pour provoquer des stutter dans les jeux en fenêtrés. Cela dépend principalement du hardware installé, de la version des pilotes et des processus fonctionnant en parallèle (par exemple, le fait d'avoir de nombreux onglets de navigateur ouverts peut provoquer des stutter dans un jeu en cours d'exécution). Pour éviter cela, à partir de la version 3.1, Godot augmente la priorité du jeu à "Above Normal". Cela aide considérablement, mais n'élimine pas complètement les stutter.

L'éliminer complètement nécessite de donner à votre jeu tous les privilèges pour devenir "time critical", ce qui n'est pas conseillé. Certains jeux peurraient le faire, mais il est conseillé d'apprendre à vivre avec ce problème, comme c'est courant pour les jeux Windows et la plupart des utilisateurs ne joueront pas aux jeux en fenêtrés (les jeux qui sont joués dans une fenêtre, par exemple les jeux de puzzle, ne présenteront généralement pas ce problème de toute façon).

Pour le plein écran, Windows accorde une priorité spéciale au jeu, de sorte que les stutter ne sont plus visibles et très rares. C'est ainsi que la plupart des jeux sont joués.

Linux

Stutter may be visible on desktop Linux, but this is usually associated with different video drivers and compositors. Some compositors may also trigger this problem (e.g. KWin), so it is advised to try using a different one to rule it out as the cause. Some window managers such as KWin and Xfwm allow you to manually disable compositing, which can improve performance (at the cost of tearing).

There is no workaround for driver or compositor stuttering, other than reporting it as an issue to the driver or compositor developers. Stutter may be more present when playing in windowed mode as opposed to fullscreen, even with compositing disabled.

Feral GameMode can be used to automatically apply optimizations (such as forcing the GPU performance profile) when running specific processes.

macOS

Généralement, macOS est sans stutter, bien que récemment quelques problèmes aient été signalés lors de l'exécution en plein écran (il s'agit d'un problème macOS). Si vous avez une machine présentant ce comportement, veuillez nous en informer.

Android

En règle générale, Android est sans stutter et sans jitter, car l'activité en cours d'exécution obtient toute la priorité. Cela dit, il peut y avoir des appareils problématiques (l'ancien Kindle Fire est connu pour en être un). Si vous voyez ce problème sur Android, faites-le nous savoir.

iOS

Les appareils iOS sont généralement sans stutter, mais les appareils plus anciens exécutant des versions plus récentes du système d'exploitation peuvent présenter des problèmes. Ceci est généralement inévitable.

Input lag

Project configuration

On platforms that support disabling V-Sync, input lag can be made less noticeable by disabling V-Sync in the project settings. This will however cause tearing to appear, especially on monitors with low refresh rates.

Increasing the number of physics iterations per second can also reduce physics-induced input latency. This is especially noticeable when using physics interpolation (which improves smoothness but increases latency). To do so, set Physics > Common > Physics Ticks Per Second to a value higher than the default 60, or set Engine.physics_ticks_per_second at run-time in a script. Values that are a multiple of the monitor refresh rate (typically 60) work best when physics interpolation is disabled, as they will avoid jitter. This means values such as 120, 180 and 240 are good starting points. As a bonus, higher physics FPSes make tunneling and physics unstability issues less likely to occur.

The downside of increasing physics FPS is that CPU usage will increase, which can lead to performance bottlenecks in games that have heavy physics simulation code. This can be alleviated by increasing physics FPS only in situations where low latency is critical, or by letting players adjust physics FPS to match their hardware. However, different physics FPS will lead to different outcomes in physics simulation, even when delta is consistently used in your game logic. This can give certain players an advantage over others. Therefore, allowing the player to change the physics FPS themselves should be avoided for competitive multiplayer games.

Lastly, you can disable input buffering on a per-rendered frame basis by calling Input.set_use_accumulated_input(false) in a script. This will make it so the _input() and _unhandled_input() functions in your scripts are called on every input, rather than accumulating inputs and waiting for a frame to be rendered. Disabling input accumulation will increase CPU usage, so it should be done with caution.

Hardware/OS-specific

If your monitor supports it, consider enabling variable refresh rate (G-Sync/FreeSync) while leaving V-Sync enabled, then cap the framerate in the project settings to a slightly lower value than your monitor's maximum refresh rate as per this page. For example, on a 144 Hz monitor, you can set the project's framerate cap to 141. This may be counterintuitive at first, but capping the FPS below the maximum refresh rate range ensures that the OS never has to wait for vertical blanking to finish. This leads to similar input lag as V-Sync disabled with the same framerate cap (usually less than 1 ms greater), but without any tearing.

This can be done by changing the Application > Run > Max FPS project setting or assigning Engine.max_fps at run-time in a script.

On some platforms, you can also opt into a low-latency mode in the graphics driver options (such as the NVIDIA Control Panel on Windows). The Ultra setting will give you the lowest possible latency, at the cost of slightly lower average framerates. Forcing the GPU to use the maximum performance profile can also further reduce input lag, at the cost of higher power consumption (and resulting heat/fan noise).

Finally, make sure your monitor is running at its highest possible refresh rate in the OS' display settings.

Also, ensure that your mouse is configured to use its highest polling rate (typically 1,000 Hz for gaming mice, sometimes more). High USB polling rates can however result in high CPU usage, so 500 Hz may be a safer bet on low-end CPUs. If your mouse offers multiple DPI settings, consider also using the highest possible setting and reducing in-game sensitivity to reduce mouse latency.

On Linux, disabling compositing in window managers that allow it (such as KWin or Xfwm) can reduce input lag significantly.

Reporting jitter, stutter or input lag problems

Si vous signalez un problème de stutter ou de jitter (ouverture d'une issue) non causé par l'une des raisons ci-dessus, veuillez spécifier très clairement toutes les informations possibles sur l'appareil, le système d'exploitation, les versions de pilote, etc. Cela peut aider à mieux le dépanner.

If you are reporting input lag problems, please include a capture made with a high speed camera (such as your phone's slow motion video mode). The capture must have both the screen and the input device visible so that the number of frames between an input and the on-screen result can be counted. Also, make sure to mention your monitor's refresh rate and your input device's polling rate (especially for mice).

Also, make sure to use the correct term (jitter, stutter, input lag) based on the exhibited behavior. This will help understand your issue much faster. Provide a project that can be used to reproduce the issue, and if possible, include a screen capture demonstrating the bug.