Unreal Engine de Epic Games es sin duda alguna la herramienta de creación más popular y usada dentro de la industria del videojuego. Se trata de un motor flexible, con unos royalties decentes, es compatible con todas las plataformas y tiene la capacidad de dar vida a los juegos con los mejores gráficos de toda una generación. Pero no todo el monte es orégano. Algunos títulos que usan Unreal Engine sufren de stuttering, unos molestos microcortes que aparecen durante la compilación de los shaders o sombreadores. Consciente de este problema, Epic Games ha explicado qué pasa y qué está haciendo para solucionarlo.
Cómo funcionan las cosas y el origen del problema
Los shaders son pequeños fragmentos de código que se ejecutan en la GPU para llevar a cabo los distintos pasos que intervienen en la renderización de las imágenes (iluminación, sombreado, posprocesamiento, deformación...). Para crear un juego con Unreal Engine se usa C++ y blueprints (una forma de programación visual), y para que sea más sencillo codificar los gráficos se recurre a una API como DirectD3 o Vulkan. Sin embargo, la GPU no entiende lo que le dice la API, así que debe convertir el código en un formato que pueda procesar.
Cuando se introdujo un método mediante el cual el controlador traduce el código para que la GPU lo entienda y lo pueda ejecutar, los juegos eran relativamente sencillos. A medida que los juegos se han vuelto más complejos y las GPUs más potentes, se ha empezado a ver más código de sombreadores y los controladores también han empezado a realizar transformaciones más sofisticadas. En consecuencia, el coste de compilación en tiempo de ejecución se ha convertido en un problema. El síntoma es el stuttering y la solución que proponen las APIs modernas es el concepto de Pipeline State Objects (PSO).
"Normalmente, en el renderizado de un objeto intervienen varios sombreadores (por ejemplo, un sombreador de vértices y otro de píxeles trabajando en conjunto), así como otros ajustes para la GPU: modo de cribado, modo de mezcla, modos de comparación de plantillas y profundidad...", explica Epic Games. "Juntos, estos elementos describen la configuración (o estado) de la canalización (pipeline) de la GPU".
"Algunos ajustes influyen en el código ejecutable de los sombreadores, por lo que hay casos en los que el controlador solo puede empezar a compilar sombreadores cuando se procesa el comando de dibujo", añade Epic Games. "Esto puede tardar decenas de milisegundos o más para un solo comando de dibujo, lo que se traduce en fotogramas muy largos la primera vez que se usa un sombreador, un fenómeno conocido por la mayoría de los jugadores como stuttering o hitching [parones]".
"Las API modernas requieren que los desarrolladores empaqueten todos los sombreadores y ajustes que usarán para una solicitud de dibujo en un Pipeline State Object (PSO) y lo definan como una sola unidad", continúa Epic Games. "Básicamente, los PSO se pueden construir en cualquier momento, por lo que en teoría los motores pueden crear todo lo que necesitan con suficiente antelación (por ejemplo, durante la carga) para que la compilación tenga tiempo de terminar antes de renderizar".
La solución se llama precaché de PSO
Antes del lanzamiento de Unreal Engine 5.2 Epic Games recomendaba empaquetar los PSO más usados en una caché que se creaba al iniciar el juego o al cargar una partida guardada o nivel. El problema de este método es que requiere de muchos recursos y la caché debe mantenerse actualizada cuando cambia el contenido. Esta solución es especialmente problemática en los juegos con mundos muy dinámicos que pueden usar decenas de miles de PSO.
Para contrarrestar los mencionados problemas Epic Games introdujo en Unreal Engine 5.2 las precachés de PSO, una técnica que determina los potenciales PSO mientras se carga el juego. "Cuando se carga un objeto, el sistema examina sus materiales y usa información de la malla (por ejemplo, si es estática o animada), así como el estado global (por ejemplo, los ajustes de calidad de vídeo), para calcular un subconjunto de posibles PSO que podrían usarse para renderizar el objeto", explica Epic Games. "Este subconjunto sigue siendo más grande que lo que se usa al final, pero mucho más pequeño que el rango completo de posibilidades, de ahí que resulte factible compilarlo durante la carga".
"Los objetos que se crean mientras se carga el mapa almacenan con antelación en la caché sus PSO mientras se muestra la pantalla de carga", añade Epic Games. "Los que se transmiten o aparecen durante la partida pueden esperar a que sus PSO estén listos antes de renderizarse o usar un material predeterminado que ya esté compilado. En la mayoría de casos, esto solo retrasa la transmisión varios fotogramas, algo imperceptible. Este sistema logra eliminar los microcortes en la compilación de los PSO para materiales y funciona sin interrupciones con el contenido generado por los usuarios".
Los controladores de la GPU guardan los PSO compilados en el SSD o disco duro para cargarlos directamente cuando se vuelven a necesitar en sesiones de juegos posteriores, pero también se pueden almacenar en la memoria del sistema. Sin embargo, los PSO en precaché pueden aumentar el uso de memoria en más de 1 GB, así que solo debería usarse en dispositivos con suficiente RAM. "Estamos trabajando en soluciones que reduzcan el impacto en la memoria y decidan automáticamente cuándo mantener los PSO en precaché", dice Epic Games.
Yo solo quiero jugar
La conclusión para el que solo quiere jugar y sufre el stuttering es que Epic Games sabe que la compilación de los shaders es un problema en los juegos que usan Unreal Engine y tiene una solución. En el artículo, que es más extenso que este texto, se lanzan algunas recomendaciones a los desarrolladores, que son los responsables de aplicar las mitigaciones y soluciones de Epic Games para que los jugadores no tengan problemas de stuttering. Como jugador no se puede hacer nada. Solo queda esperar a que la precaché de PSO mejore.
Cómo funcionan las cosas y el origen del problema
Los shaders son pequeños fragmentos de código que se ejecutan en la GPU para llevar a cabo los distintos pasos que intervienen en la renderización de las imágenes (iluminación, sombreado, posprocesamiento, deformación...). Para crear un juego con Unreal Engine se usa C++ y blueprints (una forma de programación visual), y para que sea más sencillo codificar los gráficos se recurre a una API como DirectD3 o Vulkan. Sin embargo, la GPU no entiende lo que le dice la API, así que debe convertir el código en un formato que pueda procesar.
Cuando se introdujo un método mediante el cual el controlador traduce el código para que la GPU lo entienda y lo pueda ejecutar, los juegos eran relativamente sencillos. A medida que los juegos se han vuelto más complejos y las GPUs más potentes, se ha empezado a ver más código de sombreadores y los controladores también han empezado a realizar transformaciones más sofisticadas. En consecuencia, el coste de compilación en tiempo de ejecución se ha convertido en un problema. El síntoma es el stuttering y la solución que proponen las APIs modernas es el concepto de Pipeline State Objects (PSO).
"Normalmente, en el renderizado de un objeto intervienen varios sombreadores (por ejemplo, un sombreador de vértices y otro de píxeles trabajando en conjunto), así como otros ajustes para la GPU: modo de cribado, modo de mezcla, modos de comparación de plantillas y profundidad...", explica Epic Games. "Juntos, estos elementos describen la configuración (o estado) de la canalización (pipeline) de la GPU".
"Algunos ajustes influyen en el código ejecutable de los sombreadores, por lo que hay casos en los que el controlador solo puede empezar a compilar sombreadores cuando se procesa el comando de dibujo", añade Epic Games. "Esto puede tardar decenas de milisegundos o más para un solo comando de dibujo, lo que se traduce en fotogramas muy largos la primera vez que se usa un sombreador, un fenómeno conocido por la mayoría de los jugadores como stuttering o hitching [parones]".
"Las API modernas requieren que los desarrolladores empaqueten todos los sombreadores y ajustes que usarán para una solicitud de dibujo en un Pipeline State Object (PSO) y lo definan como una sola unidad", continúa Epic Games. "Básicamente, los PSO se pueden construir en cualquier momento, por lo que en teoría los motores pueden crear todo lo que necesitan con suficiente antelación (por ejemplo, durante la carga) para que la compilación tenga tiempo de terminar antes de renderizar".
La solución se llama precaché de PSO
Antes del lanzamiento de Unreal Engine 5.2 Epic Games recomendaba empaquetar los PSO más usados en una caché que se creaba al iniciar el juego o al cargar una partida guardada o nivel. El problema de este método es que requiere de muchos recursos y la caché debe mantenerse actualizada cuando cambia el contenido. Esta solución es especialmente problemática en los juegos con mundos muy dinámicos que pueden usar decenas de miles de PSO.
Para contrarrestar los mencionados problemas Epic Games introdujo en Unreal Engine 5.2 las precachés de PSO, una técnica que determina los potenciales PSO mientras se carga el juego. "Cuando se carga un objeto, el sistema examina sus materiales y usa información de la malla (por ejemplo, si es estática o animada), así como el estado global (por ejemplo, los ajustes de calidad de vídeo), para calcular un subconjunto de posibles PSO que podrían usarse para renderizar el objeto", explica Epic Games. "Este subconjunto sigue siendo más grande que lo que se usa al final, pero mucho más pequeño que el rango completo de posibilidades, de ahí que resulte factible compilarlo durante la carga".
"Los objetos que se crean mientras se carga el mapa almacenan con antelación en la caché sus PSO mientras se muestra la pantalla de carga", añade Epic Games. "Los que se transmiten o aparecen durante la partida pueden esperar a que sus PSO estén listos antes de renderizarse o usar un material predeterminado que ya esté compilado. En la mayoría de casos, esto solo retrasa la transmisión varios fotogramas, algo imperceptible. Este sistema logra eliminar los microcortes en la compilación de los PSO para materiales y funciona sin interrupciones con el contenido generado por los usuarios".
Los controladores de la GPU guardan los PSO compilados en el SSD o disco duro para cargarlos directamente cuando se vuelven a necesitar en sesiones de juegos posteriores, pero también se pueden almacenar en la memoria del sistema. Sin embargo, los PSO en precaché pueden aumentar el uso de memoria en más de 1 GB, así que solo debería usarse en dispositivos con suficiente RAM. "Estamos trabajando en soluciones que reduzcan el impacto en la memoria y decidan automáticamente cuándo mantener los PSO en precaché", dice Epic Games.
Yo solo quiero jugar
La conclusión para el que solo quiere jugar y sufre el stuttering es que Epic Games sabe que la compilación de los shaders es un problema en los juegos que usan Unreal Engine y tiene una solución. En el artículo, que es más extenso que este texto, se lanzan algunas recomendaciones a los desarrolladores, que son los responsables de aplicar las mitigaciones y soluciones de Epic Games para que los jugadores no tengan problemas de stuttering. Como jugador no se puede hacer nada. Solo queda esperar a que la precaché de PSO mejore.
UE 5 ha salido bastante rana. Está costando que salgan juegos con buen rendimiento. Lo considero gran culpable de la generación a medio gas que estamos pasando.
Tanta dependencia a un motor ha pasado factura cuando las expectativas no se han cumplido.
En consolas se sabe de antemano el hardware sobre el que va a funcionar, los shaders se compilan para ese hardware y au.
En pc eso no puede hacerse porque cada pc es diferente, debe compilarse cuando se ejecuta. Por eso se hacen esas cosas de meter todo lo que se requiera compilar en un nivel invisible y cargar el nivel para forzar la compilación. Hay peña que lo que hace es cargar todos los niveles uno detrás de otro para forzar la compilación. Con peña me refiero a desarrolladores, no a jugadores.
En consola salen más optimizados a parte de que los juegos salen más recortados para así funcionar mejor, son otro mundo.
Cuando baje de precio lo pillaré, es uno de mis juegos favoritos de todos los tiempos (por delante está el silent hill 1).
Pero me daría pena no poder jugarlo a gusto sinceramente.
Saludos!
https://www.reddit.com/r/gaming/comment ... ssues_and/