Así influye la caché de sombreado en el rendimiento de tus juegos

Así influye la caché de sombreado en el rendimiento de tus juegos

Josep Roca

Muchas veces habréis visto entre los archivos temporales de eliminar de Windows o para ganar espació la llamada caché de sombreadores de DirectX o Shader Cache. Sí alguna vez os habéis preguntado qué es y porque el rendimiento de los juegos al borrarla baja en picado solo tenéis que leer este artículo.

Las GPU son procesadores al igual que las CPU, pero son diferentes desde el momento en su paralelismo está orientado a lo que son los hilos de ejecución. Por eso se dice que una procesador gráfico es del tipo TLP mientras que uno central es del tipo ILP. A esto hemos de añadirle que mientras que los hilos de ejecución en la gráfica no son están orientados a los procesos sino a las primitivas gráficas o los datos.

Dicho de otra manera, cada triángulo, píxel o fragmento tiene su propio programa shader para cada una de las etapa del pipeline 3D. El cual se escribe en un lenguaje de alto nivel, por ejemplo HLSL si estamos hablando de DirectX o GLSL si hablamos de OpenGL o Vulkan. Aunque también hay los hay exclusivos de ciertos sistemas como es el PSGL de las consolas PlayStation de SONY. Pues bien, estos programas necesitan ser compilados y, por tanto, pasados de código fuente a binario.

¿Qué es la Shader Cache?

Shader Cache CoD

El problema viene cuando al contrario de lo que ocurre con las CPU donde todas son x86, en el caso de las GPU lo que es el set de registros e instrucciones no es común ya no entre marcas, sino también entre arquitecturas de una misma marca. Esto hace que el código de los shaders se tenga que ir compilando mientras jugamos, provocando problemas de Stuttering y de rendimiento. Por lo que el binario generado se almacena en un archivo que al cargar de nuevo el juego se volverá a cargar sobre la memoria de vídeo de la tarjeta gráfica a la que conocemos como shader cache o caché de sombreadores.

Por lo que si actualizamos nuestra tarjeta gráfica estos se tendrán que generar para cada uno de nuestros juegos de nuevo, si la borramos del disco duro o el SSD también. Es más, este es uno de los motivos por los cuales no es bueno juzgar una tarjeta gráfica cuando usamos un juego por primera vez. Sobre todo si queremos medir su rendimiento regular.

También ocupa espacio la VRAM

Cache Shader Control Panel NVIDIA

La GPU de tu tarjeta gráfica solo accede a la RAM del sistema a través de la interfaz PCI Express y haciendo uso de su unidad DMA, por lo que la shader caché se va a cargar junto a la información visual necesaria para componer la escena desde la unidad de almacenamiento a la RAM y de esta a la memoria de vídeo. Aunque con DirectStorage se espera que el hardware gráfico sea capaz de acceder a la unidad SSD de forma directa, disminuyendo la latencia de acceso y el problema que es tener que depender de la CPU.

Muchos juegos están bien desarrollados y la shader cache ocupa poco espacio, pero otros no tanto y acaba ocurriendo que esta ocupa una gran cantidad de la memoria de la gráfica. Lo que hace que si el driver tiene un límite asociado o el propio juego de repente nos encontremos que las nuevas compilaciones reemplacen a las antiguas y vuelvan los problemas de rendimiento iniciales.

En todo caso hay que tener en cuenta que si el juego al que estamos jugando requiere espacio en la RAM de vídeo le dará preferencia al renderizado del fotograma actual. Por lo que buscará recuperar la caché de sombreado almacenada en la memoria del sistema de manera temporal. También recordar que los vuelcos a la unidad de almacenamiento se hacen continuamente, ya que una vez el shader de una primitiva gráfica se ha generado ya no hará falta hacerlo de nuevo.

El Ray Tracing y la shader cache

En el trazado de rayos la pregunta que se hace más a menudo la GPU es del tipo Booleano. ¿Hace intersección este rayo con esta primitiva gráfica? La respuesta no siempre es un sí y, por tanto, existe una condición que se dará o no según sean las circunstancias. Por lo que al ejecutar por primera vez dicho shader será necesario compilar y generar la shader caché para todos los resultados posibles.

Shader Caché en consolas

XSX, XSS, PS5 Consolas

Una consola de videojuegos va a tener los mismos componentes siempre, desde el primer modelo que sale de fábrica hasta el último. Aunque hayan pasado varios años sus especificaciones no cambiarán. Por ejemplo a día de hoy podéis encontrar modelos más veteranos que la tarjeta gráfica más vieja. Una forma de aprovechar su inmutabilidad del hardware es hacer uso de los llamados shaders ya compilados en la instalación del juego. Esto hace que no sea necesario generar una shader caché para cada juego, pero es también un arma de doble filo.

Por ejemplo si quieres hacer un consola más potente y compatible hacia atrás tienes las siguientes opciones:

  • Exportar la ISA a la GPU del nuevo sistema, haciendo que esta funcione como un superconjunto de la anterior. Esto es lo que ha hecho AMD en PlayStation 5 y Xbox Series con arquitectura RDNA 2 para ejecutar sin problemas los juegos de la anterior generación pensados para GCN.
  • Integrar toda la circuitería gráfica del sistema anterior en el nuevo sistema. Esto es algo que hizo Nintendo en sus consolas hasta 3DS y SONY con su segunda PlayStation y algunos modelos de la tercera.

A nivel de los emuladores lo que se hace en muchos casos es coger los shaders ya compilados y hacer el proceso inverso, generando un código intermedio que puede generar una Shader Caché generada para funcionar con tu tarjeta gráfica. Sin embargo, no es una ciencia exacta y te puedes encontrar con ciertos fallos gráficos al ejecutar los juegos.

Optimizaciones para los fabricantes de GPU

Lovelace Hopper Organización

Tanto NVIDIA cómo AMD suelen incluir optimizaciones en los últimos drivers para los juegos más punteros. Estas no solo incluyen los settings óptimos para un mayor rendimiento, sino también la shader caché ya optimizada para cada juego y de mejores especificaciones que en el juego base. Y es que a ambos fabricantes les interesa que su tarjeta gráfica más avanzada tenga el máximo rendimiento posible en el juego más potente de todos que existe en la actualidad.

Por lo que estos dejan dinero a los diferentes estudios de desarrollo, quienes optimizan los programas shader para ciertas arquitecturas gráficas y generan una caché de sombreado qué funciona mejor que la que viene con el juego de base. Esto se hace para incentivar la compra de nuevos modelos y crear una obsolescencia programa, la cual es necesaria para que haya un flujo de consumo que sostenga la industria. Es por ello que muchos juegos sin apenas cambios visuales a sus entregas anteriores acaban teniendo peor rendimiento.

¡Sé el primero en comentar!