Entrevista técnica: Trials Evolution
Digital Foundry habla con RedLynx.
En una época marcada por el desarrollo multiplataforma las exclusivas para consola ya no son tan abundantes, especialmente en Xbox 360, donde Microsoft no sólo ha reducido sus estudios first-party sino que también ha limitado el desarrollo interno de motores en favor de soluciones middleware (el próximo Fable, por ejemplo, funciona con el Unreal Engine).
Un juego que evita esta tendencia es el fenomenal Trials Evolution de RedLynx, un título diseñado desde cero para el hardware de Microsoft por uno de los estudios más respetados del sector y que ya se puede descargar en el bazar de Xbox Live.
En este especial de Digital Foundry hablamos cara a cara con Sebastian Aaltonen, de RedLynx, para discutir sobre las cosas que aprendieron de Trials HD, su enfoque para el ambicioso editor Track Central y todas las mejoras en el motor de rendering de uno de los videojuegos tecnológicamente más avanzados para la consola de Microsoft.
Texturas virtuales, iluminación, resolución, anti-aliasing, tecnología de post-procesado, técnicas GPGPU... sigue leyendo para descubrir por qué Trials Evolution no sólo es una obra maestra a nivel jugable, sino también un ejemplo de desarrollo puntero de videojuegos para Xbox 360.
Habían dos cosas respecto al DLC que queríamos mejorar. No teníamos ningún sistema de scripts en Trials HD, así que no podíamos añadir nuevos minijuegos con retos en el DLC (los DLCs son tan sólo paquetes con contenido en Xbox Live). Trials HD cargaba todo en la RAM al arrancar, y eso limitaba la cantidad de objetos y texturas que se podían añadir en el DLC.
En la secuela queríamos arreglar esos dos problemas. El streaming de datos soluciona el límite de memoria y hemos implementado un complejo sistema de scripting visual para eliminar el tema de los minijuegos. Huelga decir que el sistema de scripting visual se convirtió rápidamente en todo un sistema de creación de juegos que nos permite crear una gran variedad de cosas (desde shooters en primera persona hasta juegos de carreras de coches).
"El feedback de los usuarios siempre ha sido muy importante para nosotros. Por suerte, a menudo vemos que nuestras propias ideas casan bastante bien con las de los usuarios."
El feedback de los usuarios siempre ha sido muy importante para nosotros. Por suerte, a menudo vemos que nuestras propias ideas casan bastante bien con las de los usuarios. El multijugador, la opción para compartir circuitos de forma global y los escenarios exteriores son algo que nos han pedido los usuarios a menudo desde Trials 2 Second Edition. El gran éxito de Trials HD hizo posible que al final creáramos el juego de nuestros sueños.
No teníamos un sistema automatizado de recolección de métricas en Trials HD, pero analizamos los datos de las tablas de récords y de los foros de usuarios. Esta información fue crucial para descubrir la dificultad del juego y ver qué niveles acababan siendo demasiado difíciles para la mayoría de usuarios. Lo más importante que aprendimos era que el juego necesitaba tutoriales en condiciones y una curva de dificultad más suave.
"Nuestro motor gráfico ahora usa una interfaz de bajo nivel con la GPU, en vez de depender de la API de alto nivel DirectX."
Incrementar la distancia de dibujado de 40 metros a 2000 metros implica renderizar cinco veces más objetos por frame que en Trials HD. Muchas cosas del motor se han rehecho para poder soportar ese incremento de objetos. Por ejemplo, el motor gráfico ahora usa una interfaz de bajo nivel más 'cercana al hardware' de la GPU en vez de DirectX, una API de alto nivel que le envía las instrucciones.
Hemos optimizado por completo nuestro sistema de partículas con instrucciones VMX128, y esto liberó uno de los seis threads de hardware para propósito visual, permitiendo al mismo tiempo doblar la cantidad de partículas. Ahora tenemos un buffer de profundidad basado en oclusión piramidal que descarta los objetos muy rápido, y ofrece una mejora de rendimiento en escenas complejas. Y hemos implementado LOD (nivel de detalle) en la geometría de objetos y del terreno para rebajar la carga poligonal según la distancia de la cámara.
El sistema de mapeado de sombras también ha mejorado. El nuevo sistema calcula límites muy precisos para los mapas de cascada de sombras basándose en el análisis del buffer de profundidad (algo inspirado por el algoritmo SDSM de Lauritzen, Salvi y Lefohn), y eso permite alcanzar el nivel requerido de calidad de los mapas de sombras para los terrenos grandes sin demasiado coste extra.
Ahora hacemos streaming de todo: mallas (triángulos y vértices), mapa de altura del terreno, mapa de vegetación y texturas. Para hacer un streaming eficiente de las mallas tuvimos que comprimir el formato de vértices tanto como fuese posible. Para modelos texturizados se usó un pixel shader con un cálculo de tangente basado en derivadas. Permite ahorrar un montón de ancho de banda y memoria, pero hacía también que los vertex shaders fuesen mucho más rápidos. Para otras mallas experimentamos con varios métodos, pero al final usamos un formato de vértices compacto de 16 bytes. Estas modificaciones también hacían el renderizado un poco más rápido debido al menor uso de memoria de la GPU, así que la era una situación perfecta.
"El texturizado virtual nos permite usar texturas mucho más grandes en los objetos, y libera a los artistas de muchas ataduras a la hora de diseñar el mundo del juego."
Para el streaming de texturas usamos nuestro sistema propio de texturas virtuales. A diferencia del sistema de texturas virtuales de id Software, diseñado para hacer todo el mapeado con una textura, nuestro sistema está diseñado para minimizar el uso de espacio al tiempo que ofrece una buena mezcla entre variación de textura y resolución.
El texturizado virtual realmente ha cambiado la forma en que trabajamos con texturas. El sistema hace un análisis completo de la escena visible y determina qué zonas con texturas debe cargarse en memoria. Está diseñado para mantener sólo en la memoria los pixels de las texturas que se necesitan para renderizar la escena actual. Al haber siempre una cantidad constante de pixeles en pantalla (720p = 921.000 pixeles), el consumo de memoria de la textura virtual siempre es el mismo, sin importar lo grandes que sean las texturas que contiene el mundo del juego. Esto no permite aplicar texturas a los objetos tan grandes como 2048x2048 (e incluso en algunos casos 4096x4096) y libera a los artistas de muchas ataduras a la hora de diseñar el mundo del juego.
Cuando cargamos los datos de la textura virtual del disco duro se deben descomprimir muy rápido: todo se mezcla con los datos base y se recomprime en un formato para la GPU al vuelo. Hemos implementado un rápido compresor basado en GPGPU para liberar de esa carga a la GPU. Otras tareas de streaming se realizan como trabajos de la CPU, y se programan en los núcleos para mantener los trabajos principales primero (llenando los agujeros en ejecución).
Ahora tenemos una pipeline de iluminación con corrección de gamma, así que el renderizado se ve mucho más natural que antes. También hemos añadido un sistema de graduación de color controlado por los artistas que permite añadir filtros de Photoshop y combinarlos en una gran tabla de textura 3D que se aplica al final de la pipeline. Esto también incluye los datos de reparación gamma PWL de Xbox (para que la imagen se acerque lo más posible a sRGB real).
El humo y el polvo son básicamente partículas con alpha blending y un poco de efecto borroso de fondo (una nueva característica). Nuestro nuevo sistema optimizado permite usar más partículas, así que hemos usado tantas como sea posible. También añadimos una niebla exponencial físicamente veraz y un filtro 'god ray' por post-proceso que añade un poco de efecto volumétrico a los efectos de iluminación y niebla.
Hemos mejorado aún más nuestro viejo sistema de renderizado de partículas. Sigue usando usando front-to-back premultiplied destination alpha blending con stencil counting para rechazar capas extra de partículas (que no se verían debido al fuerte overdraw). El truco del stencil-counting funciona muy bien para mejorar el fillrate, y la ecuación de alpha blending premultiplicado permite renderizar todas las partículas (tanto aditivas como mezcladas por porcentaje) en una única llamada. Hemos optimizado nuestro radix sorter (que se usa para ordenar las partículas y objetos). Está parcialmente vectorizado y se ha optimizado muy bien para la cache.
"Se aplicaron miles y miles de optimizaciones (manuales) de cache y CPU, y también vectorizamos con VMX128 todo el código que se podía vectorizar."
Todo el motor se optimizó durante un periodo de un año. La PPC CPU de Xbox es antigua en diseño, así que es vital optimizar muy bien el código si quieres sacarle rendimiento. Se aplicaron miles y miles de optimizaciones (manuales) de cache y CPU, y también vectorizamos con VMX128 todo el código que se podía vectorizar. Así que ahora el código está especialmente optimizado para la arquitectura PPC del procesador de la consola.
Hemos usado el memexport de la GPU un poco más, puesto que siempre me ha gustado GPGPU. En Trials Evolution generamos el follaje del terreno, procesamos las partículas y comprimimos las texturas con la GPU. Nuestros shaders de iluminación y anti-aliasing usan microcódigo específico de Xbox con branching "warp wide". Esta técnica reduce el coste del branching dinámico incoherente (pero depende del tamaño de warp de la GPU y por lo tanto no está disponible en la mayoría de plataformas PC GPGPU excepto CUDA).
Hicimos algo de investigación y llegamos a la conclusión de que no se han llegado a vender nunca televisores 1280x720p no nativos. 1366x768 era/es el estándar HD-ready "720p" para TV, y los equipos 1080p son mucho más habituales en los últimos dos años y medio, desde el lanzamiento de Trials HD. No vimos ninguna razón por la cual renderizar nativamente a 1280x720, ya que la mayoría de teles reescalarían la imagen, y nadie la vería con un pixel ratio perfecto 1:1. Así que apostamos por un ligero sub-HD (pero con 16:9 correcto) y dejamos que el reescalador de gran calidad del hardware de Xbox 360 hiciera el escalado a la resolución nativa del televisor.
"Hemos usado una versión modificada de FXAA. Su origen es FXAA 2, pero nuestra versión provoca un emborronado significativamente menor en las texturas, y nuestra versión corre a 0,8ms, menos de un cinco por ciento del frame de 16,66ms."
Hemos usado una versión modificada de FXAA. Su origen es FXAA 2, pero nuestra versión provoca un emborronado significativamente menor en las texturas. Hemos usado un truco específico para Xbox que aporta un rendimiento extra del shader (limitando el efecto a zonas con bordes de alto contraste). Nuestra versión corre a 0,8 milisegundos, menos de un cinco por ciento del frame de 16,66 milisegundos.
Hice pruebas con 3D estereoscópico al principio de la producción, pero al final no tuvimos tiempo para trabajar en características tecnológicas que sólo beneficiaban a una parte muy pequeña de los usuarios. Conseguir que el mundo del juego funcione a 60 frames por segundos y optimizar las nuevas técnicas de streaming consumió todo el tiempo de nuestros programadores de tecnología.
En esta ocasión los cambios en las físicas no fueron tan radicales. Hemos actualizado a una versión más nueva de Bullet Physics. Desgraciadamente eso implicaba volver a escribir las optimizaciones para Xbox. Pero esta vez conocíamos mucho más los detallitos del hardware y los resultados al final fueron mejores.
Las modificaciones en las físicas eran necesarias, porque la moto se mueve más rápido en los exteriores y los saltos son más grandes. La suspensión debía modificarse para que los impactos más grandes no provocasen que la moto se quedase enganchada en el suelo. En Trials Evolution también damos a los usuarios más opciones para controlas las propiedades físicas de los objetos. Todo, desde la masa a la fricción, puede cambiarse en el editor.
"Las modificaciones en las físicas eran necesarias, porque la moto se mueve más rápido en los exteriores y los saltos son más grandes. La suspensión debía modificarse para que los impactos más grandes no provocasen que la moto se quedase enganchada en el suelo."
Trials Evolution es nuestro primer juego multijugador para Xbox Live, así que naturalmente había un proceso de aprendizaje. Por suerte nuestros modos de juego toleran bien la latencia, ya que las motos no pueden chocar entre ellas. En Supercross cada moto tiene su propio carril, y en Trials ves a tus oponentes como fantasmas en tiempo real. Esto nos permite tener un control perfecto del multijugador. Si la red es lenta, sólo las motos de los oponentes muestran lag. Tu moto siempre se mueve perfectamente.
Cada consola sólo simula su propio mundo de físicas. Enviamos una representación visual optimizada a través de la red. Lo que sí hacemos es usar el motor de físicas para hacer la extrapolación y predecir mejor dónde estarán las motos de los oponentes, ya que los datos recibidos por la conexión de red siempre están un poco desfasados.
Track Central es muy importante para nosotros. Aporta un estilo YouTube al tema de compartir contenido, dando a los usuarios opciones para puntuar y buscar. El sistema de scripting visual permite que los usuarios creen sus propias reglas. Ya hemos visto shooters en primera persona, juegos de carreras en 3D, shooters con vista cenital y homenajes a juegos como Pac-Man, Angry Birds o Super Mario. ¡Y en el momento de escribir esto hace sólo dos días que está a la venta! Es básicamente una plataforma de creación de juegos 3D para Xbox 360.
No hemos pensado aún en el próximo Trials. Estamos todavía muy emocionados con el lanzamiento que acaba de producirse, y estamos ocupados configurando los servidores y haciendo el mantenimiento de los foros. Cuando se disipe el humo entonces ya nos centraremos en futuros proyectos.
Por supuesto, seguimos con atención las tendencias sobre la tecnología del futuro. Compramos tarjetas gráficas DirectX11 para nuestros ordenadores tan pronto como estuvieron disponibles, para poder probar nuevas características como DirectCompute o el teselado. Las GPUs actuales han evolucionado en monstruos de computación paralela que se pueden usar para mucho más que el simple renderizado gráfico. Será interesante ver cómo los futuros juegos se beneficiarán de avances como ese...