Corrección del traqueteo, trastabilleo y retraso de entrada

¿Qué son el jitter, stutter y el retraso de entrada?

El traqueteo (jitter) y trastabilleo (stutter) son dos alteraciones diferentes en el movimiento visible de objetos en la pantalla que pueden afectar a un juego, incluso cuando se ejecuta a velocidad completa. Estos efectos son principalmente visibles en juegos donde el mundo se mueve a una velocidad constante en una dirección fija, como juegos de carreras o plataformas.

El retraso de entrada (input lag) no se relaciona con el traqueteo y trastabilleo, pero suelen discutirse juntos. El retraso de entrada se refiere a una demora visible en pantalla al realizar acciones con el ratón, teclado, mando o pantalla táctil. Puede relacionarse con el código del juego, del motor o con factores externos (como el hardware). El retraso de entrada es más notorio en juegos que usan el ratón para apuntar, como los juegos en primera persona. Este retraso no se puede eliminar por completo, pero se puede reducir de varias maneras.

Distinguir el traqueteo y trastabilleo (jitter vs stutter)

Un juego que se ejecute a una velocidad de fotogramas normal sin mostrar ningún efecto va a parecer fluido:

../../_images/motion_normal.gif

Un juego que presenta traqueteo se sacudirá constantemente de manera muy sutil:

../../_images/motion_jitter.gif

Finalmente, un juego que presenta trastabilleo parecerá suave, pero dará la impresión de detenerse o retroceder un fotograma cada pocos segundos:

../../_images/motion_stutter.gif

Jitter (traqueteo)

Puedes haber muchas causas de jitter. La más típica ocurre cuando la frecuencia de física del juego (generalmente 60 Hz) se ejecuta a una resolución diferente a la frecuencia de actualización del monitor. Verifica si la frecuencia de actualización de tu monitor es diferente de 60 Hz.

En ocasiones, solo algunos objetos parecen traquetear (como el personaje o el fondo). Esto ocurre cuando se procesan en fuentes de tiempo diferentes (uno se procesa en el paso de físicas mientras que otro se procesa en el paso inactivo). Godot 3.1 ha realizado algunas mejoras en este aspecto, desde permitir que los cuerpos cinemáticos sean animados en el ciclo _process regular, hasta correcciones adicionales en el temporizador de cuadros (frame timer) para abordar este problema.

Esta causa de traqueteo se puede reducir al activar interpolación de física en la Configuración del Proyecto. La interpolación de física suavisará las actualizaciones de física interpolando las transformaciones de objetos de física entre fotogramas de física. De esta manera, la representación de objetos de física siempre se verá fluida sin importar la frecuencia de fotogramas o la de tick de física.

Enabling physics interpolation has some caveats you should be aware of. For example, care should be taken when teleporting objects so that they don't visibly interpolate between the old position and new position when it's not intended. See the Physics Interpolation documentation for details.

Nota

Activar la interpolación de física incrementará el retraso de entrada en comportamientos que dependan del tick de física, como el movimiento del jugador. En la mayoría de los juegos esto suele ser preferible al traqueteo, pero considéralo cuidadosamente con juegos que operen en una frecuencia de fotograma fija (como juegos de ritmo o de pelea). Este incremento en retraso de entrada se puede compensar al incrementar la frecuencia de tick de física como se describe en la sección Input lag.

Stutter (trastabilleo)

El trastabilleo puede ocurrir debido a dos razones diferentes. La primera y más obvia es que el juego no pueda mantener un rendimiento de fotogramas completo. Resolver esto es específico del juego y requerirá optimización para mejorar el rendimiento.

Otro motivo de trastabilleo común es el trastabilleo por compilación de shader. Este ocurre cuando un shader necesita compilarse porque un nuevo material o efecto de partículas apareció en el juego. Este tipo de trastabilleo generalmente sólo pasa durante el primer jeugo, o después de una actualización del controlador gráfico en la que la caché del shader es invalidada.

A partir de Godot 4.4, al usar los renderizadores Forward+ o Móvil, el motor intenta evitar trastabilleo por compilación de shader usando un enfoque ubershader. Para que este enfoque sea más efectivo, hay que tener cuidado al diseñar escenas y recursos apra que Godot pueda recolectar toda la información posible cuando la escena/recurso cargue, en lugar de cuando se dibuja por primera vez. Véase Reducción de trastabilleo (stutter) por compilaciones de shader (pipeline) para más información.

Sin embargo, al usar el renderizador de Compatibilidad, no se puede usar este enfoque ubershader debido a limitaciones técnicas en OpenGL. Por lo tanto, para evitar el trastabilleo por compilación de shader en el renderizador de Compatibilidad, necesitarás aparecer cada malla y efecto visual frente a la cámara por un solo fotograma cuando el nivel esté cargando. Esto asegura que el shader esté compilado cuando cargue el nivel, en lugar de ocurrir durante el juego. Esto se puede hacer detrás de una UI 2D sólida (tal como un nodo ColorRect de pantalla completa) para que no sea visible al jugador.

Nota

En las plataformas que soporten la desactivación de V-Sync, el trastabilleo se puede hacer menos notable al desactivar V-Sync en la configuración del proyecto. Sin embargo, esto causará que aparezcan rasgaduras, en especial en monitores con bajas frecuencias de actualización. Si tu monitor lo soporta, considera activar la frecuencia de actualización variable (G-Sync/FreeSync) dejando V-Sync activado. Esto permite mitigar algunas formas de trastabilleo sin introducir rasgaduras. Sin embargo, no ayudará con trastabilleos grandes, como los causados por compilación de shader.

Forzar tu targeta gráfica a usar el perfil de máximo rendimiento también puede ayudar a reducir los trastabilleos, al costo de mayor toma de poder del GPU.

Además, el sistema operativo subyacente puede inducir el trastabilleo. Aquí hay información sobre el trastabilleo en diferentes sistemas operativos:

Windows

Windows es conocido por causar trastabilleo en juegos en modo de ventana. Esto depende en gran medida del hardware instalado, la versión de los controladores y los procesos que se ejecutan en paralelo (por ejemplo, tener muchas pestañas de navegador abiertas puede causar trastabilleo en un juego en ejecución). Para evitar esto, a partir de la versión 3.1, Godot eleva la prioridad del juego a "por encima de lo normal". Esto ayuda considerablemente, pero es posible que no elimine completamente el trastabilleo.

Eliminating this completely requires giving your game full privileges to become "Time Critical", which is not advised. Some games may do it, but it is advised to learn to live with this problem, as it is common for Windows games and most users won't play games windowed (games that are played in a window, e.g. puzzle games, will usually not exhibit this problem anyway).

Para el modo de pantalla completa, Windows otorga una prioridad especial al juego, por lo que el trastabilleo ya no es visible y es muy raro. Así es como se juega la mayoría de los juegos.

When using a mouse with a polling rate of 1,000 Hz or more, consider using a fully up-to-date Windows 11 installation which comes with fixes related to high CPU utilization with high polling rate mice. These fixes are not available in Windows 10 and older versions.

Truco

Games should use the Exclusive Fullscreen window mode, as opposed to Fullscreen which is designed to prevent Windows from automatically treating the window as if it was exclusive fullscreen.

La pantalla completa está diseñada para aplicaciones de GUI que quieran usar transparencia píxel a píxel sin riesgo de que el sistema operativo la deshabilite. Esto lo logra al dejar una línea de un píxel al fondo de la pantalla. En contraste, la pantalla completa exclusiva usa el tamaño real de la pantalla y permite que Windows reduzca el traqueteo y el retraso de entrada en juegos de pantalla completa.

Linux

El trastabilleo puede ser visible en Desktop Linux, pero esto generalmente está asociado con diferentes controladores de video y compositores. Algunos compositores también pueden desencadenar este problema (por ejemplo, KWin), por lo que se recomienda probar con un compositor diferente para descartarlo como causa. Algunos gestores de ventanas como KWin y Xfwm permiten desactivar la composición manualmente, lo que puede mejorar el rendimiento (al costo de rasgaduras.)

No hay una solución alternativa para el trastabilleo causado por los controladores o compositores, aparte de informarlo como un problema a los desarrolladores de los controladores o compositores. El trastabilleo puede estar más presente cuando se juega en modo de ventana en lugar de pantalla completa, incluso con la composición desactivada.

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

macOS

En general, macOS no presenta trastabilleo, aunque recientemente se han reportado algunos errores al ejecutar en pantalla completa (esto es un error de macOS). Si tienes una máquina que muestra este comportamiento, por favor avísanos.

Android

En general, Android no presenta trastabilleo ni traqueteo porque la actividad en ejecución obtiene toda la prioridad. Dicho esto, puede haber dispositivos problemáticos (se sabe que algunos modelos antiguos de Kindle Fire presentan este problema). Si ves este problema en Android, por favor avísanos.

iOS

Los dispositivos iOS generalmente no presentan trastabilleo, pero los dispositivos más antiguos que ejecutan versiones más recientes del sistema operativo pueden experimentar problemas. Esto generalmente es inevitable.

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. It's suggested to make V-Sync available as an option for players to toggle.

When using the Forward+ or Mobile rendering methods, another way to reduce visual latency when V-Sync is enabled is to use double-buffered V-Sync instead of the default triple-buffered V-Sync. Since Godot 4.3, this can be achieved by reducing the Display > Window > V-Sync > Swapchain Image Count project setting to 2. The downside of using double buffering is that framerate will be less stable if the display refresh rate can't be reached due to a CPU or GPU bottleneck. For instance, on a 60 Hz display, if the framerate would normally drop to 55 FPS during gameplay with triple buffering, it will have to drop down to 30 FPS momentarily with double buffering (and then go back to 60 FPS when possible). As a result, double-buffered V-Sync is only recommended if you can consistently reach the display refresh rate on the target hardware.

Aumentar la cantidad de iteraciones físicas por segundo también puede reducir la latencia de entrada inducida por la física. Esto es especialmente notable cuando se usa la interpolación física (que mejora la suavidad pero aumenta la latencia). Para ello, configure Physics > Common > Physics Ticks Per Second en un valor mayor que el predeterminado 60, o configure Engine.physics_ticks_per_second en tiempo de ejecución en un script. Los valores que son un múltiplo de la frecuencia de actualización del monitor (normalmente 60) funcionan mejor cuando la interpolación física está deshabilitada, ya que evitarán el traqueteo. Esto significa que valores como 120, 180 y 240 son buenos puntos de partida. Como beneficio adicional, los FPS de física más altos hacen que sea menos probable que ocurran problemas de tunelización e inestabilidad física.

La desventaja de aumentar los FPS de física es que el uso de la CPU aumentará, lo que puede generar cuellos de botella en el rendimiento en juegos con código de simulación de física complejo. Esto se puede solucionar aumentando los FPS de física solo en situaciones donde la baja latencia es crítica o permitiendo que los jugadores ajusten los FPS de física para que se adapten a su hardware. Sin embargo, diferentes FPS de física generarán resultados diferentes en la simulación de física, incluso cuando se use delta de forma consistente en la lógica del juego. Esto puede dar ventaja a ciertos jugadores sobre otros. Por lo tanto, se debe evitar permitir que el jugador modifique los FPS de física en juegos multijugador competitivos.

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.

Truco

On any Godot project, you can use the --disable-vsync command line argument to forcibly disable V-Sync. Since Godot 4.2, --max-fps <fps> can also be used to set an FPS limit (0 is unlimited). These arguments can be used at the same time.

Hardware/OS-specific

Si tu monitor lo admite, considera habilitar la frecuencia de actualización variable (G-Sync/FreeSync) mientras dejas V-Sync habilitado, luego limita la velocidad de cuadros en la configuración del proyecto a un valor ligeramente inferior a la frecuencia de actualización máxima de tu monitor como se indica en`esta página <https://blurbusters.com/howto-low-lag-vsync-on/>`__. Por ejemplo, en un monitor de 144 Hz, puedes establecer el límite de velocidad de cuadros del proyecto en 141. Esto puede parecer contradictorio al principio, pero limitar los FPS por debajo del rango de frecuencia de actualización máxima garantiza que el sistema operativo nunca tenga que esperar a que finalice el borrado vertical. Esto genera un retraso de entrada similar al de V-Sync deshabilitado con el mismo límite de velocidad de cuadros (generalmente menos de 1 ms mayor), pero sin ningún desgarro.

This can be done by changing the Application > Run > Max FPS project setting or assigning Engine.max_fps at runtime 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 when using X11, disabling compositing in window managers that allow it (such as KWin or Xfwm) can reduce input lag significantly.

Informar problemas de traqueteo, trastabilleo o retraso de entrada

Si estás informando un problema de trastabilleo o traqueteo (abriendo un reporte) que no es causado por ninguna de las razones mencionadas anteriormente, por favor especifica de manera muy clara toda la información posible sobre el dispositivo, el sistema operativo, las versiones de los controladores, etc. Esto puede ayudar a identificar y resolver el problema de manera más efectiva.

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).

Asegúrate también de usar el término correcto (traqueteo, trastabilleo, retraso de entrada) basado en el comportamiento exhibido. Esto ayudará a comprender tu problema mucho más rápido. Proporciona un proyecto que se pueda utilizar para reproducir el problema y, si es posible, una captura de pantalla que muestre el error.