octubre 15, 2006

DirectX 10, la verdadera nueva next-gen

He pensado en hacer una serie de artículos sobre DirectX 10 que llega justo con el revuelo de la salida al mercado de Wii y PS3, aunque en realidad el salto tecnológico que va a suponer es, en mi opinión, muy superior al de ambas consolas.
He partido el artículo, pues me ha salido bastante largo, y al final no se si se quedará en dos o tres partes, en la primera explicaré qué es DirectX10, que diferencias trae con respecto a DirectX9. En el segundo haré una pequeña introducción al nuevo Pipeline que introduce DirectX 10, qué mejoras suponen los Shaders unificados (ya se intuye del primer artículo) y una comparativa con screenshots de DirectX 10. En el último artículo comentaré qué podemos esperar de DirectX 10.1, por qué esas mejoras no estan en DirectX 10 y qué supondrá desde el punto de vista visual y en el performance. Finalmente en ese artículo haré mi análisis subjetivo y comparativo entre PC y las consolas, intentando centrarme en la estrategia de Microsoft.

DirectX 10, PARTE I.

Introducción:

DirectX 10 ha sido llamado, desde que se sabe que esta en desarrollo, de distintas formas, a saber DirectX Next, Windows Graphics Fundation 1.0 y 2.0, aunque finalmente se ha decidido llamarlo DirectX 10 como continuación de le familia DirectX, para mí, es más un D3D 10, pues el resto de las tecnologías de DirectX no han sufrido los cambios de Direct 3D.

Antes de nada habría que empezar contestando muy brevemente a la pregunta ¿qué es DirectX?, pues bien, se puede decir que DirectX nació como una herramienta de abstracción que aísla el Software (SW) que usa el sonido, los gráficos y los dispositivos de entrada como Joystick, volantes y demás, del Hardware (HW) que hace el trabajo. Es una interfaz (API) que se “monta” encima de los drivers de cada uno de los dispositivos, con el objetivo de aislar al software cliente (juegos, por ejemplo) de los drivers.

Esta aproximación, aunque cómoda para los programadores e impulsadota de un SW más estándar (los desarrolladores no se preocupan del HW, sólo de DirectX) no deja de estar sujeta a ciertas restricciones que la propia API provoca al SW, es decir, nos podemos encontrar con casos teóricamente posibles desde el punto de vista de la capacidad del HW pero que la propia API no es capaz de gestionar, suponiendo con ello un problema insalvable.

Este es el aspecto negativo que conlleva usar una API como DirectX, pero a su vez, lleva otros aspectos positivos que compensan en el cómputo global. Hacer el SW independiente del HW, siempre que este disponga de un driver que cumpla con los requisitos de DirectX, es muy cómodo para ser utilizado por los desarrolladores, pues supone que estos no se tendrán que preocupar de la incómoda gestión del Hardware y esto ya es de por sí, tan importante u util que compensa los problemas de "performance" que pueda causar.

Aunque todo esto que comento parece muy cómodo en el papel, lo cierto es que hasta ahora DirectX no cubre la totalidad de las tareas que se pueden realizar sobre el HW y esta situación no esta exenta de problemas. Hasta ahora nos hemos encontrado casos como una Radeon X800 o una GForce 6800, ambas DirectX 9, pero que cada una de ellas soporta diferentes tipos de Shaders, cada uno de ellos implementado por el fabricante y sobre el que el desarrollador debía hacer las operaciones específicas de cada familia para poder aprovechar la totalidad de la tarjeta gráfica. Este caso no lo volveremos a ver en DirectX 10, pues a partir de su implantación los desarrolladores y los usuarios finales sólo se van a tener que preocupar de las características que ofrece DirectX, siendo cada una de las tarjetas compatible con una versión concreta de DirectX y significando que el hardware deberán cumplir unas características tecnológicas muy concretas. Microsoft regulará la introducción de las nuevas características gráficas a partir de futuras extensiones de las versiones de DirectX 10 (como por ejemplo DirectX 10.1), y ATI y NVIDIA verán su campo de acción reducido a cumplir esa tecnología de la forma más óptima posible (que no es poco).

Obviamente, todos esos cambios no se harán de espaldas a los principales fabricantes de tarjetas gráficas y será con ellos con quienes se negocie la salida de cada una de las tecnologías. Esto para el usuario final es muy bueno por que su elección se reducirá a conocer que extensión de DirectX que cumple el HW que desea comprar y el desempeño final de ese HW.

Los desarrolladores, por otro lado, no se tendrán que preocupar de que sus motores aprovechen tecnologías que usa una familia concreta de tarjetas gráficas y los usuarios no verán infrautilizado su HW por que algunos estudios no aprovechan al 100% la potencia de las gráficas no implementando determinadas características de sus tarjetas gráficas.

La nueva API, que ha sido desarrollada desde cero, tendrá una relación mucho más estrecha con el Sistema Operativo (S.O.) y podremos ver como más de una aplicación, al mismo tiempo, hace uso de las características 3D de la tarjeta (hasta ahora imposible) y será muy raro ver al SO sufrir bajadas en el rendimiento por culpa del driver de la tarjeta de Video. Además, veremos como podremos cambiar “on the fly” el driver de video y podremos resetear el estado de la tarjeta sin que eso afecte al SO, ni haya que reiniciarlo.

Toda esta estabilidad la da la nueva tecnología llamada Vista Display Driver Model(VVDM) que reemplazará al modelo de driver de video en Win XP y de la que hablaremos un poco más en el último artículo de esta serie.

Este nuevo modelo y la estrecha relación de DirectX 10 con el SO, hace del todo imposible que Windows XP pueda ejecutar DirectX 10 y por tanto será exclusivo de Windows Vista (además del componente de marketing que tiene la exclusividad en Win Vista y la necesidad que crea en el usuario de actualizarse a Vista). Veremos también, como la compatibilidad hacia atrás de DirectX 10 con DirectX 9 no será directa y se hará a través de un emulador, esta versión se llamará DirectX 9L.

Entonces, cuales eran las restricciones principales que DirectX 9 suponía para los desarrolladores? Y cuales son las nuevas características que oferta DirectX 10?

La principal y más importante restricción era sin duda la llamada “The Small Batch Problem”, este problema es muy conocido entre los desarrolladores por el cuidado que deben tener de no sufrirlo, se trata del “API overhead” introducido en la gestión de los objetos en escena, me explico mejor:

El Juego, para cada uno de los objetos que debe renderizar en una la escena, hace uso de la API, esta a su vez llama al Driver de Video que será el SW que hace uso de nuestra tarjeta de video. El problema está en que todas estas llamadas API+DRIVER deben ser gestionadas por la CPU, pudiendo llegar a tener un coste del 40% del tiempo de ejecución. Con DirectX 10 este cuello de botella se ha reducido a menos de la mitad.

Obviamente, este problema no es menor si tenemos un gran número de objetos (como personajes, una silla, un coche … etc) en escena, pues cada uno de esos objetos necesitan un tratamiento específico y llamadas al API y al Driver. Actualmente la limitación que causa la API esta en aproximadamente 500 objetos, con DirectX 10 se esperan poder tener hasta miles de objetos en una misma escena.

Esta limitación de objetos en escena hace sufrir la inmersión del jugador en el entorno y se espera que tengamos escenas realmente impresionantes con la nueva tecnología, mucho más cercanas a la realidad.

Otra de las restricciones en DirectX 9 y las GPUs actuales es el hecho de tener caminos de Pipeline fijos, de nuevo me explico mejor:

Actualmente las tarjetas de video disponen de dos componentes principales a la hora de gestionar los objetos, vertices y puntos de una escena, esos dos componentes son el Vertex Sader y el Píxel Shader. Para que nos hagamos una idea, los objetos son tratados primero por el Vertex Shader y después estos son pasados por el Píxel Shader en el camino a la renderización final y por el que cada punto es tratado dependiendo de una serie de factores como el ambiente, la luz… y un largo etcétera (todo esto, simplificando bastante!).

Pues bien, el número de elementos de ejecución tanto para los Vertex Shader como los Píxel Shader son uno de los puntos a favor de cada una de las tarjetas gráficas. Para hacernos una idea, actualmente la ATI X1900XTX cuenta con ocho unidades Vertex y cuarenta y ocho (16*3) para píxel, en cuanto que una NVIDIA 7950GT tiene 24 pixel Shaders y ocho Vertex Shader (mas info aquí). En un caso real (como el presentado en la gráfica de abajo) no es de extrañar que suceda que en un momento concreto necesitemos muchos Píxel Shader pero pocos Vertex y viceversa. Con el estado actual de las cosas y puesto que contamos con un Path fijo, esta situación es inevitable, pero si en vez de tener unidades especializadas en cada una de las tareas, simplemente tuviéramos unidades de ejecución genéricas, podríamos reutilizarlas y no tenerlas infrautilizada algunas, mientras que otras están saturadas..




En el siguiente artículo contaré qué son los Shaders Unificados, qué es Shader 4.0 y veremos ejemplos del salto tecnoglógico que supone DirectX 10 con respecto a DirectX 9.