DirectX 12: Todo lo que debes saber, incluso su rendimiento

Mucho se ha dicho de lo que se puede lograr utilizando la API DirectX 12, pero también hay mucho que no sabemos acerca de la API. Sí, va a reducir la sobrecarga de la CPU, una gran victoria para los jugadores más exigentes que juegan a sus juegos utilizando una configuración de doble GPU. También supone reducir la sobrecarga de la GPU y mejorar el rendimiento en un 20% y no hace falta decir que las perspectivas son simplemente increíbles.

Durante la GDC del año pasado, Microsoft nos dio una visión decente de lo que la próxima versión de la API DirectX 12 podría hacer, pero en realidad nunca entró en los detalles más relevantes. Durante la GDC de este año, Max McMullen, principal desarrollador para Direct3D y DXGI de Microsoft, se adelantó y le dio al público una mirada en profundidad a las nuevas características y mejoras de rendimiento que la nueva API trae.

DirectX 12

En primer lugar, el trabajo en DirectX 12 se ha completado en gran medida gracias a trabajar en los drivers. Puede haber pequeños ajustes debido a la retroalimentación que Microsoft va a recibir de los desarrolladores, pero en general la versión actual está muy cerca de la versión final que tiene previsto enviar a finales de este año. Microsoft tiene sus drivers totalmente funcionales para aumentar el rendimiento a través de los tres proveedores de hardware, es decir, Intel, AMD y Nvidia.

McMullen también reveló que el hardware compatible con DirectX 12 ya cuenta con el 50% del mercado actual en PC, y se espera que ese número ascienda al 66% cuando la API se ponga en marcha a finales de este año. En términos de acceso temprano, más de 400 desarrolladores de más de 100 estudios ya tienen acceso a ella. La API tiene como objetivo dar a los desarrolladores la eficiencia y el control de las consolas en PCs gaming con el mayor atractivo de que ninguna funcionalidad de representación se pierda y todo lo que los desarrolladores pueden hacer en DX11 pueda ser fácilmente hecho en DX12.

Dada la complejidad y extensión del artículo pueden existir traducciones no fiables. Si directamente quieres ver las primeras pruebas de rendimiento oficiales, debes irte a casi el final de la noticia. Si directamente no quieres leer nada, mira los .gif al final de la noticia, un buen resumen.

Características y descripción

Direct3D 12 API

Una visión general de las capacidades de DirectX 12.

Pipeline State Objects

En DirectX 12 todos los objetos están en un solo pipeline.

En el caso de DX11, había varios objetos que dieron lugar a que los drivers finalizaran el compilado en tiempo de ejecución durante las llamadas de dibujado resultando en una sobrecarga de la CPU y por lo tanto en una reducción del rendimiento. Durante el análisis de DX12, Microsoft ha optado por combinar todos estos objetos en un único y coherente Pipeline State Object donde los desarrolladores pueden tener un único pipeline compilado y utilizarlo y compilar el resto de los estados de hardware de una sola vez.

Explicit Resource Binding Management

Recursos para la gestión y unión de los descriptores.

DX11 era una API bastante saturada donde los desarrolladores estaban haciendo un montón de recursos de shader y renderizado. Así que esto se ha traducido en una gran sobrecarga en función del número de recursos que el desarrollador planee utilizar. Con DX12, Microsoft ha optado por un modelo de memoria explícita donde los objetos vinculantes se almacenan como estructuras almacenadas en la memoria de la GPU. Los desarrolladores pueden crear un descriptor para una GPU y copiar de un lugar a otro, y todos estos descriptores se apilan en un montón descriptores en la forma de un array.

Resource Binding Tiers

Niveles de recursos obligatorios de acuerdo con el tamaño máximo admitido por los montones de descriptores.

Binding Tiers in the D3D 12 Market

Cuota de mercado de cada nivel.

Explicit Resource Binding Hazard Resolution

Peligros tales como el problema de mantener la coherencia entre la GPU se resuelven mediante la API ResourceBarrier.

Con el fin de maximizar el rendimiento a través de las GPUs, Microsoft tiene estos niveles llamados como Resource Binding Tiers (Recurso de Encuadernación de Tiers) que se diferencian en cuanto al número de montones de descriptores. El primer nivel es para hardware temprano con DX1 y el tercer nivel es para las GPUs modernas que permiten más montones de descriptores. El recurso explícito vinculante se asegura de que no haya riesgos de recursos o problemas a la hora de mantener la coherencia entre la GPU o los objetivos del renderizado hacia y desde las texturas. Para este propósito, la API ResourceBarrier se encarga de tales problemas que puedan surgir debido a "los peligros".

Flexible Pipeline Parameterization

Una de las características más interesantes de DX12, Flexible Pipeline Parameterization (Parametrización Flexible del Pipeline).

Cambiando de tema, Microsoft pasó mucho tiempo trabajando en una parametrización flexible del pipeline. Microsoft describe esta característica como una parte impresionante y una de las joyas que DX12 tiene para ofrecer. Con esta función los desarrolladores pueden aprovechar plenamente la CPU y GPU. Con el uso de este, los desarrolladores pueden cambiar los descriptores sobre la marcha durante el dibujado. Esto se logra mediante rutas rápidas como los registros para pasar los parámetros al pipeline. Esto es similar a la función que se utiliza para el pipeline del sombreado, que consiste en una lista de argumentos como enteros o flotantes y los van pasando al pipeline de sombreado.

Explicit CPU-GPU Synchronization

Resultados de la liberación de memoria con la sincronización de la CPU y GPU.

En las API anteriores, si el desarrollador elimina un recurso, la API no lo borrará de la memoria de vídeo hasta que los comandos de representación se ejecuten en la GPU que, obviamente, resulta en más sobrecarga. Pero a medida que los desarrolladores de juegos saben lo que va a ser eliminado y cuando, sólo tendrían que sincronizarlos con la GPU y eliminarlos según la necesidad. Un buen ejemplo que McMullen afirmó durante el discurso fue la transmisión constante de la geometría entre la CPU y la GPU. Se puede asignar una gran cantidad de memoria que se puede acceder tanto por la CPU y la GPU, escribirlos en el buffer, hacerlas y en consecuencia realizar un seguimiento cuando esas llamadas de renderizado se completan en la GPU. Una vez que estén completos, la memoria puede ser utilizada para cualquier otro propósito.

New Rendering Features

New Features Levels

DirectX 12 introduce nuevas características de renderizado.

Algunas de las novedades que introduce DirectX 12 es la Conservative Rasterization (Rasterización Conservadorora) que puede ser utilizada para la detección de la oclusión, la representación de curvas y la transparencia. En pocas palabras, los desarrolladores no necesitarán crear soluciones para lograr lo anterior. En segundo lugar, el Tiled Resources Tier 3 (Recursos de Baldosas de Nivel 3): Los volúmenes como los volúmenes dispersos ahora se pueden montar fácilmente y se puede especificar el valor de la plantilla dentro de los shaders. Los nuevos niveles de rendimiento son extremadamente potentes junto con las ventajas de la CPU como el pre-cocinado de los materiales de unión y de pista.

Mejoras en el rendimiento de Unity:

Kasper Engelstoft, Ingeniero gráfico de Unity, reveló pusieron sus manos por primera vez sobre el SDK de DirectX 12 en septiembre de 2014, y en las dos semanas siguientes fueron capaces de hacer cosas usando la nueva API. A mediados de enero,  fueron capaces de lograr una tasa de éxito del 95% en sus pruebas internas. Engelstoft procedió a exhibir una demostración del uso del mapeado de sombras bajo su motor gráfico Unity Engine.

Una de las primeras cosas que buscó en Unity fue mejorar el rendimiento de la representación del sombreado, y el uso por parte de los desarrolladores de la API DX12 puede obtener mejoras en el rendimiento debido a la capacidad de la API para soportar múltiples subprocesos en la representación de sombras. Engelstoft explicó que el objetivo principal es mover tareas tales como mapas de sombras lejos del hilo principal, mientras que la liberación de otros hilos serían usadas para otras tareas. Unity tiene este concepto de un cliente y el de un dispositivo de gráficos de maestría, lo que genera una lista de comandos que se vean obligados a pasar por la API en el dispositivo cliente. Pero como se ha explicado anteriormente, utilizando DX12 es posible generar múltiples listas de comando en múltiples hilos, lo que significa que los desarrolladores pueden saltarse las listas intermedias que se traduce en mejoras de rendimiento.

El hilo principal entonces construye la lista de comandos en la escena principal, mientras que los otros hilos están trabajando en la sombra de los mapas de la lista de comandos. Esto básicamente significa que esos renderizados de las sombras dependen más del hilo principal, que está trabajando en la escena principal y cada llamada puede hacer un montón de cosas como, básicamente, sólo estar trabajando en las sombras, dejando el hilo principal para otras cosas importantes como la lógica del juego o la física.

Velocidad del renderizado de sombras DirectX 11

Marco de tiempo es de 23 ms cuando la unidad utiliza su procedimiento estándar para hacer mapas de sombras.

Como se muestra en la imagen de arriba, los mapas de renderizado de sombras fueron colocados en el hilo principal y la propia escena principal se compone de 7.000 objetos. Engelstoft reveló que se tarda alrededor de 23 ms para hacer esta escena.

Velocidad del renderizado de sombras DirectX 12

Marco de tiempo reducido a 13 ms utilizando las capacidades multi-threading (multi-hilo) de DirectX 12.

Utilizando DX12 los mapas de sombras ahora se han trasladado a otros hilos, lo que se tradujo en un marco de tiempo de 13 ms. De esta manera el programador guarda alrededor de 10 ms de tiempo de fotograma.

Hay que tener en cuenta que esto no pasó por arte de magia, la maestría del desarrollador al trabajar bajo una nueva API tiene mucho que ver. Esto va en la línea de lo que el CEO de Stardock, Brad Wardell, dijo acerca de la nueva API. Así que sí ... los desarrolladores tendrían que optimizar sus códigos y estrategias de multi-hilo.

Shader Cache y ExecuteIndirect:

Shader Cache

DirectX 12 viene embalado con el controlador desarrollador Shader Cache. Un frame típico tiene alrededor de 200 a 400 pipelines y en algunos casos hasta 1000. El caché en DX12 está absolutamente controlado por el desarrollador. Así que si se quiere desarrollar una optimización por Particle Swarm Optimization (PSO -Optimización de Partículas en Enjambre-), los desarrolladores pueden especificar una caché para almacenar la salida y luego hacer un PSO. La API dará entonces una representación binaria totalmente compilada de todas las instrucciones del hardware, por lo que todo el peso pesado y los costosos cálculos se habrían ya completado para entonces.

Algo nuevo en la API es ExecuteIndirect, que sustituye DrawIndirect y DispatchIndirect y puede realizar múltiples llamadas con una sola llamada a la API. El número de llamadas puede ser controlado por la GPU o CPU y los desarrolladores pueden incluso cambiar los enlaces entre las llamadas de dibujo.

Intel Asteroids DirectX 11

Con el fin de mostrar las ventajas de ExecuteIndirect, Microsoft ha presentado una versión actualizada de la demo de Intel Asteroids. Utilizando DX11, la velocidad de los fotogramas por segundo fue de alrededor de 28 con el promedio de uso de la CPU en un 20%. Hay que tener en cuenta que la demo se ejecuta en modo libre, que indica que DX11 puede utilizar completamente la CPU y la GPU.

Intel Asteroids DirectX 12

Al usar la API DX12 la velocidad de fotogramas casi se triplica alcanzando las 74 imágenes por segundo (fps).

Intel Asteroids DirectX 12 texturas pre-cocinadas

Si las texturas de los asteroides están "pre-cocinadas", los resultados son aún más asombrosos, pues aumenta hasta los 80 fps con exprimiendo la CPU en torno a un 30%.

Intel Asteroids DirectX 12 ExecuteIndirect

Utilizando ExecuteIndirect, se añade otra mejora en el rendimiento de la GPU en torno al 10% (90 FPS) mientras que el uso de la CPU se redujo a tan solo un 9%.

Multiengine:

Multiengine

DX12 no tiene una cola monolítica como DX11, pero tiene tipos de colas que son 3D, Compute and Copy. Copy (Copiar) es importante en los casos en que el desarrollador quiera hacer textura de fondo streaming. Compute (Cálculo) se relaciona con despachar funcionalidades y 3D. Usando la estructura de cola, los desarrolladores pueden priorizar entre cargas de trabajo o las tareas de fondo. En este momento el sistema de prioridad se basa simplemente en baja, media y alta, pero en el futuro la API puede apoyar en tiempo real las prioridades espaciales.

Fable Legends: Las comparaciones de rendimiento

Fable Legends DX11 vs DX12

Como se puede ver (malamente) en la imagen de arriba, la demostración en la parte superior se ejecuta el juego con la API DirectX 12 a 1080p a una velocidad de imágenes por segundo superior en comparación con DX11, el cual está ejecutando el juego con una resolución inferior (70 vs 69 fps).

Fable Legends DirectX 11

Fable Legends DirectX 12

En la segunda demostración, DX11 hace que Fable Legends funcione en torno a los 43 fps, mientras que DX12 tiene una media en torno a los 53 fps siendo capaz de alcanzar los 61 fps en el mejor de los casos, vs los 48 fps de DX11.

 

Resumen:

Es muy gratificante ver los pasos agigantados que ofrecerá el uso de la API DirectX 12 respecto a DirectX 11 en términos de rendimiento, recordando que los datos vistos arriba pueden mejorar aún más, ya que el desarrollo de la API seguirá vigente hasta finales de este año que será cuando se estrene con Windows 10. Después de su estreno, su desarrollo podría avanzar significativamente gracias a la ayuda de los desarrolladores.

Por otra parte, hay que recordar que la Xbox One se aprovechará de DirectX 12, aunque hay que recordar que la consola ya hace uso de una API de bajo nivel similar a DirectX 12, por lo que el impacto de la nueva API de Microsoft no será tan destacable ni tendrá un impacto tan masivo como lo tendrá las plataformas de PC.

No se puede negar que esta consola va a estar siempre limitada por su hardware, el cual no se puede sustituir y que es la naturaleza de estas máquinas por su precio medio. DirectX 12 ayudará a la Xbox One a solucionar el cuello de botella de la eSRAM haciendo que los comandos entre la CPU y la GPU sean simples y más rápidos, pero la memoria DDR3 se muestra como un verdadero lastre junto a una GPU ya limitada.

Tocará esperar a que Microsoft lance información específica respecto a DirectX 12 y la Xbox One. Pero obviamente, DirectX 12 ha sido diseñado para los gamers, la "PC Master Race" será aún más superior con la llegada de esta nueva API.


 22

 23

 24

 25

 26

 27

 28

 29

vía: Gamingbolt

Artículos relacionados