Share via


Elección de un recurso

Un recurso es una colección de datos que usa la canalización 3D. La creación de recursos y la definición de su comportamiento es el primer paso para programar la aplicación. En esta guía se tratan los temas básicos para elegir los recursos necesarios para la aplicación.

Identificación de las fases de canalización que necesitan recursos

El primer paso consiste en elegir la fase de canalización de gráficos (o fases) que usará un recurso. Es decir, identifique cada fase que leerá datos de un recurso, así como las fases que escribirán datos en un recurso. Conocer las fases de canalización en las que se usarán los recursos determina las API a las que se llamará para enlazar el recurso a la fase.

En esta tabla se enumeran los tipos de recursos que se pueden enlazar a cada fase de canalización. Incluye si el recurso se puede enlazar como entrada o salida.

Fase de canalización Entrada o salida Resource Tipo de recurso
Ensamblador de entrada En Búfer de vértices Buffer
Ensamblador de entrada En Búfer de índice Buffer
Fases del sombreador En Shader-ResourceView Buffer, Texture1D, Texture2D, Texture3D
Fases del sombreador En Búfer de Shader-Constant Buffer
Salida de flujo Fuera Buffer Buffer
Fusión de salida Fuera Vista de destino de representación Buffer, Texture1D, Texture2D, Texture3D
Fusión de salida Fuera Vista profundidad/galería de símbolos Texture1D, Texture2D

 

Identificar cómo se usará cada recurso

Una vez que haya elegido las fases de canalización que usará la aplicación (y, por tanto, los recursos que necesitará cada fase), el siguiente paso es determinar cómo se usará cada recurso, es decir, si la CPU o la GPU pueden acceder a un recurso.

El hardware en el que se ejecuta la aplicación tendrá un mínimo de al menos una CPU y una GPU. Para elegir un valor de uso, tenga en cuenta qué tipo de procesador debe leer o escribir en el recurso de las siguientes opciones.

Resource Usage Se puede actualizar mediante Frecuencia de actualización
Valor predeterminado GPU Infrecuentemente
Dinámica CPU Frecuentemente
Ensayo GPU N/D
Inmutable CPU (solo en tiempo de creación de recursos) N/D

 

El uso predeterminado se debe usar para un recurso que se espera que actualice la CPU con poca frecuencia (menos de una vez por fotograma). Idealmente, la CPU nunca escribiría directamente en un recurso con el uso predeterminado para evitar posibles penalizaciones de rendimiento.

El uso dinámico se debe usar para un recurso que la CPU actualiza con relativamente frecuencia (una o más por fotograma). Un escenario típico para un recurso dinámico sería crear búferes dinámicos de vértices e índices que se rellenarían en tiempo de ejecución con datos sobre la geometría visible desde el punto de vista del usuario para cada fotograma. Estos búferes se usarían para representar solo la geometría visible para el usuario para ese marco.

El uso provisional debe usarse para copiar datos hacia y desde otros recursos. Un escenario típico sería copiar datos en un recurso con uso predeterminado (al que la CPU no puede acceder) a un recurso con uso provisional (al que la CPU puede acceder).

Los recursos inmutables se deben usar cuando los datos del recurso nunca cambiarán.

Otra manera de examinar la misma idea es pensar en lo que hace una aplicación con un recurso.

Uso de la aplicación del recurso Resource Usage
Cargar una vez y nunca actualizar Inmutable o predeterminado
La aplicación rellena el recurso repetidamente Dinámica
Representación en textura Valor predeterminado
Acceso de CPU de datos de GPU Ensayo

 

Si no está seguro de qué uso elegir, comience con el uso predeterminado, ya que se espera que sea el caso más común. Un Shader-Constant búfer es el tipo de recurso que siempre debe tener el uso predeterminado.

Enlace de recursos a fases de canalización

Un recurso se puede enlazar a más de una fase de canalización al mismo tiempo, siempre que se cumplan las restricciones especificadas al crear el recurso. Estas restricciones se especifican como marcas de uso, marcas de enlace o marcas de acceso de cpu. Más concretamente, un recurso se puede enlazar como entrada y una salida simultáneamente, siempre y cuando la lectura y escritura de parte de un recurso no se puedan producir al mismo tiempo.

Al enlazar un recurso, piense en cómo accederá la GPU y la CPU al recurso. Los recursos diseñados para un único propósito (no usen varias marcas de uso, enlace y acceso de cpu) darán lugar a un mejor rendimiento.

Por ejemplo, considere el caso de un destino de representación que se usa como textura varias veces. Puede ser más rápido tener dos recursos: un destino de representación y una textura usada como recurso de sombreador. Cada recurso solo usaría una marca de enlace, que indica "destino de representación" o "recurso de sombreador". Los datos se copiarían de la textura render-target a la textura del sombreador.

Esta técnica en este ejemplo puede mejorar el rendimiento al aislar la escritura de destino de representación de la lectura de textura del sombreador. La única manera de asegurarse es implementar ambos enfoques y medir la diferencia de rendimiento en su aplicación concreta.

Recursos