Elección de un recursoChoosing a resource

Un recurso es una colección de datos utilizada por la canalización 3D.A resource is a collection of data that is used by the 3D pipeline. La creación de recursos y la definición de su comportamiento es el primer paso para programar la aplicación.Creating resources and defining their behavior is the first step toward programming your application. En esta guía se tratan los temas básicos para elegir los recursos necesarios para la aplicación.This guide covers basic topics for choosing the resources required by your application.

Identificación de las fases de canalización que necesitan recursosIdentify pipeline stages that need resources

El primer paso es elegir la fase de canalización de gráficos (o fases) que usará un recurso.The first step is to choose the graphics pipeline stage (or stages) that will use a resource. Es decir, identifique cada fase que va a leer los datos de un recurso, así como las fases que escribirán los datos en un recurso.That is, identify each stage that will read data from a resource as well as the stages that will write data out to a resource. 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.Knowing the pipeline stages where the resources will be used determines the APIs that will be called to bind the resource to the stage.

En esta tabla se enumeran los tipos de recursos que se pueden enlazar a cada fase de canalización.This table lists the types of resources that can be bound to each pipeline stage. Incluye si el recurso se puede enlazar como entrada o como salida.It includes whether the resource can be bound as an input or an output.

Fase de canalizaciónPipeline Stage Dentro/fueraIn/Out ResourceResource Tipo de recursoResource Type
Ensamblador de entradaInput Assembler EnIn Búfer de vérticesVertex Buffer BufferBuffer
Ensamblador de entradaInput Assembler EnIn Búfer de índiceIndex Buffer BufferBuffer
Fases del sombreadorShader Stages EnIn Sombreador: ResourceViewShader-ResourceView Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
Fases del sombreadorShader Stages EnIn Shader: búfer de constantesShader-Constant Buffer BufferBuffer
Salida de flujoStream Output FueraOut BufferBuffer BufferBuffer
Fusión de salidaOutput Merger FueraOut Representación: vista de destinoRender-target View Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
Fusión de salidaOutput Merger FueraOut Vista de profundidad/estarcidoDepth/Stencil View Texture1D, Texture2DTexture1D, Texture2D

 

Identificar cómo se utilizará cada recursoIdentify how each resource will be used

Una vez que haya elegido las fases de canalización que va a usar la aplicación (y, por lo tanto, los recursos que necesitará cada fase), el siguiente paso es determinar cómo se usará cada recurso, es decir, si se puede tener acceso a un recurso mediante la CPU o la GPU.Once you have chosen the pipeline stages that your application will use (and therefore the resources that each stage will require), the next step is to determine how each resource will be used, that is, whether a resource can be accessed by the CPU or the GPU.

El hardware en el que se ejecuta la aplicación tendrá como mínimo una CPU y una GPU.The hardware that your application is running on will have a minimum of at least one CPU and one 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.To pick a usage value, consider which type of processor needs to read or write to the resource from the following options.

Resource UsageResource Usage Se puede actualizar medianteCan be updated by Frecuencia de actualizaciónFrequency of Update
Valor predeterminadoDefault GPUGPU con poca frecuenciainfrequently
DinámicaDynamic CPUCPU mayorfrequently
EnsayoStaging GPUGPU N/Dn/a
InmutableImmutable CPU (solo en el momento de creación de recursos)CPU (only at resource creation time) N/Dn/a

 

El uso predeterminado se debe usar para un recurso que se espera que la CPU actualice con poca frecuencia (menos de una vez por fotograma).Default usage should be used for a resource that is expected to be updated by the CPU infrequently (less than once per frame). Idealmente, la CPU nunca escribiría directamente en un recurso con uso predeterminado para evitar posibles penalizaciones de rendimiento.Ideally, the CPU would never write directly to a resource with default usage so as to avoid potential performance penalties.

El uso dinámico debe usarse en un recurso que la CPU actualice con relativa frecuencia (una o más por fotograma).Dynamic usage should be used for a resource that the CPU updates relatively frequently (once or more per frame). Un escenario típico de un recurso dinámico sería crear búferes dinámicos de vértices y de í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.A typical scenario for a dynamic resource would be to create dynamic vertex and index buffers that would be filled at runtime with data about the geometry visible from the point of view of the user for each frame. Estos búferes se utilizarían para representar solo la geometría visible para el usuario para ese marco.These buffers would be used to render only the geometry visible to the user for that frame.

El uso del almacenamiento provisional debe usarse para copiar datos en otros recursos y desde ellos.Staging usage should be used to copy data to and from other resources. Un escenario típico sería copiar los datos de un recurso con uso predeterminado (al que la CPU no puede acceder) a un recurso con uso de almacenamiento provisional (al que la CPU puede tener acceso).A typical scenario would be to copy data in a resource with default usage (which the CPU cannot access) to a resource with staging usage (which the CPU can access).

Los recursos inmutables deben usarse cuando los datos del recurso nunca cambien.Immutable resources should be used when the data in the resource will never change.

Otra forma de ver la misma idea es pensar en lo que hace una aplicación con un recurso.Another way of looking at the same idea is to think of what an application does with a resource.

Cómo usa la aplicación el recursoHow Application uses the Resource Resource UsageResource Usage
Cargar una vez y no actualizar nuncaLoad once and never update Inmutable o predeterminadoImmutable or Default
La aplicación rellena recursos repetidamenteApplication fills resource repeatedly DinámicaDynamic
Representar en texturaRender to texture Valor predeterminadoDefault
Acceso de CPU de los datos de GPUCPU access of GPU data EnsayoStaging

 

Si no está seguro de qué uso elegir, empiece con el uso predeterminado, ya que se espera que sea el caso más común.If you are unsure what usage to choose, start with the default usage as it is expected to be the most common case. Un búfer de constantes de sombreador es el tipo de recurso que siempre debería tener el uso predeterminado.A Shader-Constant buffer is the one resource type that should always have default usage.

Enlazar recursos a fases de canalizaciónBinding resources to pipeline stages

Un recurso se puede enlazar a más de una fase de canalización al mismo tiempo, siempre que se cumplan las restricciones especificadas cuando se creó el recurso.A resource can be bound to more than one pipeline stage at the same time as long as the restrictions specified when the resource was created are met. Estas restricciones se especifican como marcas de uso, marcas de enlace o marcas de acceso a la CPU.These restrictions are specified as usage flags, bind flags, or cpu access flags. Más concretamente, un recurso se puede enlazar como una entrada y una salida simultáneamente siempre y cuando no se pueda realizar la lectura y la escritura de una parte de un recurso al mismo tiempo.More specifically, a resource can be bound as an input and an output simultaneously as long as reading and writing part of a resource cannot happen at the same time.

Al enlazar un recurso, piense en cómo la GPU y la CPU tendrán acceso al recurso.When binding a resource, think about how the GPU and the CPU will access the resource. Los recursos que están diseñados para un solo propósito (no se usan varias marcas de acceso de uso, enlace y CPU) serán más que probablemente resulten un mejor rendimiento.Resources that are designed for a single purpose (do not use multiple usage, bind, and cpu access flags) will more than likely result in better performance.

Por ejemplo, considere el caso de un destino de representación que se usa como textura varias veces.For example, consider the case of a render target used as a texture multiple times. Es posible que sea más rápido tener dos recursos: un destino de representación y una textura utilizada como un recurso de sombreador.It may be faster to have two resources: a render target and a texture used as a shader resource. Cada recurso usaría solo una marca de enlace, que indica "destino de representación" o "recurso de sombreador".Each resource would use only one bind flag, indicating "render target" or "shader resource". Los datos se copiarán de la textura de representación-destino a la textura del sombreador.The data would be copied from the render-target texture to the shader texture.

Esta técnica en este ejemplo puede mejorar el rendimiento aislando la escritura de destino de representación de la lectura del sombreador-textura.This technique in this example may improve performance by isolating the render-target write from the shader-texture read. La única manera de asegurarse es implementar ambos enfoques y medir la diferencia de rendimiento en una aplicación concreta.The only way to be sure is to implement both approaches and measure the performance difference in your particular application.

Temas relacionadosRelated topics

RecursosResources