Epic explica los motivos del stuttering en los juegos que usan su motor Unreal Engine y por qué es tan complicado eliminarlo
La industria de los videojuegos se encuentra en una constante búsqueda de experiencias visuales inmersivas y fluidas, sin embargo, este objetivo se ve obstaculizado por un desafío técnico fundamental: la compilación de shaders a través de los llamados PSO. Este proceso, esencial para la renderización de los juegos, puede generar algo que seguro conoces como La entrada Epic explica los motivos del stuttering en los juegos que usan su motor Unreal Engine y por qué es tan complicado eliminarlo aparece primero en El Chapuzas Informático.
![Epic explica los motivos del stuttering en los juegos que usan su motor Unreal Engine y por qué es tan complicado eliminarlo](https://elchapuzasinformatico.com/wp-content/uploads/2025/02/Unreal-Engine-Stuttering-y-lag-en-juegos-explicado.jpg)
La industria de los videojuegos se encuentra en una constante búsqueda de experiencias visuales inmersivas y fluidas, sin embargo, este objetivo se ve obstaculizado por un desafío técnico fundamental: la compilación de shaders a través de los llamados PSO. Este proceso, esencial para la renderización de los juegos, puede generar algo que seguro conoces como "lag" o "stuttering". Es un tema complejo que ciertos ingenieros de Epic han explicado largo y tendido centrándose en cómo su motor, Unreal Engine, ha abordado este desafío con su innovador sistema de pre-almacenamiento en caché de PSO, el cual, aborda parcialmente dicho lag y stuttering.
La compilación de sombreadores, conocida coloquialmente como Shader Compilation, es un proceso complejo que implica la traducción de código de alto nivel a instrucciones que la GPU puede ejecutar, como seguro has intuido, en los Shaders. Este proceso se complica aún más por la diversidad de arquitecturas de GPU existentes, lo que requiere un enfoque flexible para la compilación de Shaders. Esto genera los dos efectos negativos que hemos comentado y que intentaremos simplificar en una explicación relativamente larga.
Epic explica el motivo del stuttering en su motor Unreal Engine y por qué es tan difícil solucionarlo
Como en todo, tenemos que irnos a ciertas bases para comprender el contexto, aunque igualmente, no podemos tocarlas todas y daremos por sabido ciertas cosas, no queda otra o si no esto sería interminable. Por ello, desde el punto de vista del software, ¿qué son exactamente los shaders?
A grosso modo se puede decir que son programas que se ejecutan en la GPU para realizar los distintos pasos necesarios para renderizar los juegos, y tienen muchas funciones distintas, no solo “sombrean” como su nombre indica. Normalmente, están escritos en un lenguaje de alto nivel como HLSL, que debe compilarse en código de máquina que la GPU pueda ejecutar. Este proceso lo hace, mejor o peor, el driver del fabricante de la GPU, de ahí que tengan miles de ingenieros para desarrollarlos.
En el pasado, los juegos utilizaban sombreadores relativamente simples, y el costo de la compilación en tiempo de ejecución era insignificante. Sin embargo, a medida que las GPU se volvieron más potentes y los juegos más complejos, el costo de la compilación de sombreadores se convirtió en un problema importante. ¿Qué se hizo? Mejorar las API como DX11. Así nacieron DX12, Mantle, o Vulkan, por ejemplo.
Para solucionar la cada vez más grande complejidad con el código y el número de Shaders no bastó con aumentar el número de núcleos en la GPU (Shaders on GPU), se tuvo que dar paso a un nuevo concepto llamado PSO, o Pipeline State Objects, el cual lo cambió todo.
El problema no se solucionó al completo, sí parcialmente, pero generó otros dos más importantes
Explicado muy en general, los PSO permiten a los desarrolladores "empaquetar" todos los Shaders y configuraciones necesarias para una solicitud Draw (de dibujo) en una sola unidad, lo que permite la compilación anticipada y reduce los tirones en el juego, sea por puro lag o stuttering. Por lo tanto, la compilación de los Shaders fue tan aclamada por los desarrolladores como el hecho de las Draw Calls, pero lo que nadie esperaba es que esta solución al problema crease otros.
Los juegos comenzaron a ganar complejidad, y no solo en distintos elementos a renderizar, como materiales, superficies, elementos ocultos, sombreado propiamente dicho, sino que la cantidad de ellos ha crecido exponencialmente. Esto ha generado que de unos cientos de PSO en la actualidad se necesiten millones, puesto que las posibilidades son cada vez mayores. Esto generó durante algunos años un lag y stuttering mayor.
Por tanto, compilarlos de forma anticipada ha resultado un imposible. Por ello hubo unificación de unidades para píxeles, como los Vertex Shaders y Pixel Shaders, pero ¿cuál fue la solución más viable para salir del paso hasta que las API diesen el siguiente salto? Los motores tuvieron que avanzar antes que dichas API creando el llamado pre-almacenamiento en caché de PSO, o conocida como Pre-Caching PSO.
El Pre-Caching es paliativo y es el principal precursor del lag y el stuttering actual de Epic y su Unreal Engine
Kenzo ter Elst, Daniele Vettorel, Allan Bentham, y Mihnea Balta lo explican de una manera brillante como ingenieros de la compañía que son:
"Para poder soportar mundos más grandes y variados en los juegos y contenido generado por el usuario, Unreal Engine 5.2 introdujo el pre-almacenamiento en caché de PSO, una técnica para determinar los PSO potenciales en el momento de la carga. Cuando se carga un objeto, el sistema examina sus materiales y utiliza información de la mesh (por ejemplo, estática frente a animada), así como el estado global (por ejemplo, configuración de calidad de vídeo) para calcular un subconjunto de posibles PSO que se pueden utilizar para renderizar el objeto.
Este subconjunto es aún mayor que el que se utiliza, pero mucho menor que el rango completo de posibilidades, por lo que resulta factible compilarlo durante la carga. Por ejemplo, Fortnite Battle Royale compila alrededor de 30.000 PSO para una partida y utiliza alrededor de 10.000 de ellos, pero esa es una porción muy pequeña del espacio de combinación total, que contiene millones.
Los objetos creados durante la carga del mapa almacenan previamente en caché sus PSO mientras se muestra la pantalla de carga. Aquellos que se transmiten o se generan durante el juego pueden esperar a que sus PSO estén listos antes de renderizarse o usar un material predeterminado que ya se haya compilado. En la mayoría de los casos, esto solo retrasa la transmisión durante unos pocos fotogramas, lo que no se nota. Este sistema ha eliminado el problema de la compilación de PSO para los materiales y funciona a la perfección con el contenido generado por el usuario.
Cambiar el material de una Mesh ya visible es un caso más complicado, porque no queremos ocultarlo ni renderizarlo con un material predeterminado mientras se compila el nuevo PSO. Estamos trabajando en una API que permita que el código del juego y los planos le den pistas al sistema con anticipación, de modo que los PSO adicionales también se puedan almacenar en caché. También queremos cambiar el motor para que siga renderizando el material anterior mientras se compila el nuevo."
Entra en juego la caché del driver de Intel, AMD y NVIDIA
Entendido todo esto, queda la parte que le toca a las tres compañías que desarrollan el hardware y su propio software. Los drivers tienen cada vez más importancia, y la API curiosamente cada vez menos frente a estos. La realidad es que los drivers guardan todos los PSO compilados en tu HDD o SSD, y los cargan la primera vez en cada juego para usarlos cuando procesa.
Seguro que has visto en multitud de juegos el aviso de que están pre-compilando los Shaders, bien, estamos en ese punto. También te habrás dado cuenta de que cada vez que eso ocurre el juego suele ir muy bien, y puede que conforme pase el tiempo el rendimiento sea peor. Igualmente, te habrás fijado de que cada vez que instalas un driver nuevo, o antiguo, cada vez que cambias el que tienes y usas, el proceso vuelve a empezar.
Ahora entiendes la importancia de los PSO y el Pre-Caching, pero no nos quedaremos ahí. Los ingenieros de Epic explican en concreto cómo funciona Unreal Engine para este sistema:
"Unreal Engine aprovecha la memoria caché del driver creando PSO durante la carga y descartándolos inmediatamente cuando terminan de compilarse; por eso la técnica se llama precaching. Cuando más tarde se necesita un PSO para renderizar, el motor emite una solicitud de compilación, pero el controlador simplemente lo devuelve desde la memoria caché, porque el sistema de precaching se aseguró de que esté allí. Una vez que se utiliza un PSO para dibujar, permanecerá cargado hasta que todas las primitivas que lo utilizan se eliminen de la escena, por lo que no seguimos pidiéndoselo al controlador en cada fotograma.
Descartar después de almacenar en caché previamente tiene la ventaja de que los PSO no utilizados no se guardan en la memoria. La desventaja es que recuperar un PSO de la caché del controlador justo cuando se lo necesita puede llevar algo de tiempo y, aunque es mucho más rápido que compilarlo, esto puede provocar stuttering, o traversal stuttering, la primera vez que se renderiza un material.
Una solución sencilla es mantener los PSO almacenados previamente en caché en lugar de descartarlos, pero esto puede aumentar el uso de memoria en más de 1 GB, por lo que solo debe hacerse en máquinas que tengan suficiente RAM. Estamos trabajando en soluciones para reducir el impacto en la memoria y decidir automáticamente cuándo se pueden mantener activos los PSO almacenados previamente en caché."
Por ello, la caché sigue siendo más relevante que el ancho de banda de la memoria, sea HBM, GDDR6, GDDR6X o la nueva GDDR7. De hecho, el balance entre Shaders (núcleos) y caché es totalmente relevante, y debe incrementarse por parte de Intel, AMD y NVIDIA debido a la inclusión de las unidades específicas para Ray Tracing e IA, ya que de no hacerlo, la latencia aumentará proporcionalmente, que es justamente lo que está pasando en las RTX 50.
Esto merma tanto el rendimiento como la experiencia visual del usuario en cuanto a suavidad al jugar se refiere.
Epic nos da algunas soluciones para mejorar el lag y el stuttering, pero es más a nivel desarrollador
Como la explicación, aunque la hemos simplificado y endulzado, va destinada a los desarrolladores de cara a mejorar sus juegos en lag y stuttering, Epic ofrece unas soluciones para Unreal Engine que no nos valdrán demasiado, pero que a favor, son interesantes de analizar para comprender hacia dónde se está trabajando:
Nuestro objetivo final es gestionar el pre-almacenamiento en caché de forma automática y óptima, de modo que los desarrolladores de juegos no tengan que hacer nada para evitar los fallos. Hasta que el sistema esté terminado, todavía hay algunas cosas que los licenciatarios (desarrolladores) pueden hacer para garantizar una experiencia de juego fluida:
-
Utilice la última versión del motor: Dado que el almacenamiento previo en caché es un trabajo en progreso, las versiones más nuevas del motor funcionarán mejor. Si no es posible realizar una actualización completa, debería poder implementar la mayoría de las mejoras en su versión personalizada del motor.
-
Detecta errores de PSO en tu juego: Utiliza r.PSOPrecache.Validation=2 como se explica en la documentación para identificar errores o PSO tardíos y comprender las causas.
-
Limpia la memoria caché del controlador antes de realizar pruebas de juego: Si utilizas el argumento de línea de comandos -clearPSODriverCache durante las pruebas de juego, podrás ver cómo será la experiencia del jugador cuando ejecutes el juego por primera vez o después de una actualización del driver. Presta atención a los problemas en este modo y resuélvelos utilizando las herramientas de creación de perfiles y depuración mencionadas anteriormente.
-
Repite este proceso con regularidad: Los cambios en el contenido o el código del juego pueden generar nuevos problemas o exponer errores en el sistema. Recomendamos enfáticamente a los licenciatarios que controlen las estadísticas de PSO como parte de sus procedimientos de prueba automatizados.
-
Estate atento a otros tipos de traversal stuttering. La compilación de PSO no es la única razón del stuttering y lag durante el juego, y es difícil identificar la causa raíz sin instrumentación. Cree perfiles del juego regularmente durante el desarrollo y las pruebas para rastrear otros procesos costosos que pueden causar picos de tiempo de cuadros, como carga sincrónica, generación o entrada de secuencias excesivas, capturas de escenas activadas por el movimiento, etc.
En definitiva, el software avanza, pero más lento que el hardware, como suele ocurrir. La inercia sigue siendo empujar con hardware el rendimiento mientras que el software "llega y mejora". Las diferencias radican en las optimizaciones que se hacen, y como hemos visto, el Pre-Caching de PSO es solo una medida paliativa que los drivers pueden apoyar, de ahí que todos se estén volcando de un tiempo a esta parte con ellos, siendo una parte tan fundamental en el rendimiento y experiencia del jugador.
La entrada Epic explica los motivos del stuttering en los juegos que usan su motor Unreal Engine y por qué es tan complicado eliminarlo aparece primero en El Chapuzas Informático.