Scelta di una risorsaChoosing a resource

Una risorsa è una raccolta di dati usata dalla pipeline 3D.A resource is a collection of data that is used by the 3D pipeline. La creazione di risorse e la definizione del relativo comportamento è il primo passo verso la programmazione dell'applicazione.Creating resources and defining their behavior is the first step toward programming your application. Questa guida illustra gli argomenti di base per la scelta delle risorse richieste dall'applicazione.This guide covers basic topics for choosing the resources required by your application.

Identificare le fasi della pipeline che necessitano di risorseIdentify pipeline stages that need resources

Il primo passaggio consiste nel scegliere la fase o le fasi della pipeline grafica che utilizzeranno una risorsa.The first step is to choose the graphics pipeline stage (or stages) that will use a resource. Ovvero identificare ogni fase che leggerà i dati da una risorsa e le fasi in cui i dati vengono scritti in una risorsa.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. Conoscere le fasi della pipeline in cui verranno usate le risorse determina le API che verranno chiamate per associare la risorsa alla 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.

Questa tabella elenca i tipi di risorse che è possibile associare a ogni fase della pipeline.This table lists the types of resources that can be bound to each pipeline stage. Include la possibilità di associare la risorsa come input o output.It includes whether the resource can be bound as an input or an output.

Fase pipelinePipeline Stage Ingresso/UscitaIn/Out RisorsaResource Tipo di risorsaResource Type
Assembler inputInput Assembler InIn Buffer vertexVertex Buffer BufferBuffer
Assembler inputInput Assembler InIn Buffer indiceIndex Buffer BufferBuffer
Fasi dello shaderShader Stages InIn Shader-ResourceViewShader-ResourceView Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
Fasi dello shaderShader Stages InIn Buffer costante shaderShader-Constant Buffer BufferBuffer
Output flussoStream Output In uscitaOut BufferBuffer BufferBuffer
Unione outputOutput Merger In uscitaOut Visualizzazione destinazione renderingRender-target View Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
Unione outputOutput Merger In uscitaOut Visualizzazione profondità/stencilDepth/Stencil View Texture1D, Texture2DTexture1D, Texture2D

 

Identificare il modo in cui ogni risorsa verrà utilizzataIdentify how each resource will be used

Dopo aver scelto le fasi della pipeline che verranno usate dall'applicazione (e quindi le risorse necessarie per ogni fase), il passaggio successivo consiste nel determinare la modalità di utilizzo di ogni risorsa, ovvero se è possibile accedere a una risorsa dalla CPU o dalla 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.

L'hardware su cui è in esecuzione l'applicazione avrà almeno una CPU e una GPU.The hardware that your application is running on will have a minimum of at least one CPU and one GPU. Per selezionare un valore di utilizzo, valutare il tipo di processore che deve leggere o scrivere nella risorsa dalle opzioni seguenti.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 Può essere aggiornato daCan be updated by Frequenza di aggiornamentoFrequency of Update
PredefinitoDefault GPUGPU raramenteinfrequently
DinamicoDynamic CPUCPU frequentefrequently
Gestione temporaneaStaging GPUGPU n/dn/a
Non modificabileImmutable CPU (solo al momento della creazione delle risorse)CPU (only at resource creation time) n/dn/a

 

Usare l'utilizzo predefinito per una risorsa che dovrebbe essere aggiornata raramente dalla CPU (meno di una volta per frame).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 non scriverebbe mai direttamente in una risorsa con utilizzo predefinito, in modo da evitare possibili penalizzazioni delle prestazioni.Ideally, the CPU would never write directly to a resource with default usage so as to avoid potential performance penalties.

L'utilizzo dinamico deve essere usato per una risorsa che la CPU aggiorna relativamente spesso (una o più volte per frame).Dynamic usage should be used for a resource that the CPU updates relatively frequently (once or more per frame). Uno scenario tipico per una risorsa dinamica consiste nel creare buffer di indice e vertex dinamici che verrebbero compilati in fase di esecuzione con dati sulla geometria visibile dal punto di vista dell'utente per ogni frame.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. Questi buffer verrebbero usati per eseguire il rendering solo della geometria visibile all'utente per quel frame.These buffers would be used to render only the geometry visible to the user for that frame.

L'utilizzo della gestione temporanea deve essere utilizzato per copiare dati da e verso altre risorse.Staging usage should be used to copy data to and from other resources. Uno scenario tipico consiste nel copiare i dati in una risorsa con utilizzo predefinito (a cui la CPU non può accedere) a una risorsa con utilizzo di gestione temporanea (a cui la CPU può accedere).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).

Le risorse non modificabili devono essere usate quando i dati nella risorsa non verranno mai modificati.Immutable resources should be used when the data in the resource will never change.

Un altro modo per esaminare la stessa idea è pensare a cosa fa un'applicazione con una risorsa.Another way of looking at the same idea is to think of what an application does with a resource.

Modalità di utilizzo della risorsa da parte dell'applicazioneHow Application uses the Resource Resource UsageResource Usage
Carica una sola volta e non aggiorna maiLoad once and never update Non modificabile o predefinitoImmutable or Default
L'applicazione riempie più volte la risorsaApplication fills resource repeatedly DinamicoDynamic
Esegui rendering in tramaRender to texture PredefinitoDefault
Accesso alla CPU dei dati GPUCPU access of GPU data Gestione temporaneaStaging

 

Se non si è certi dell'utilizzo da scegliere, iniziare con l'utilizzo predefinito perché si prevede che sia il caso più comune.If you are unsure what usage to choose, start with the default usage as it is expected to be the most common case. Un buffer di costante shader è un tipo di risorsa che deve avere sempre l'utilizzo predefinito.A Shader-Constant buffer is the one resource type that should always have default usage.

Associazione di risorse alle fasi della pipelineBinding resources to pipeline stages

Una risorsa può essere associata a più di una fase della pipeline nello stesso momento, purché siano soddisfatte le restrizioni specificate al momento della creazione della risorsa.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. Queste restrizioni vengono specificate come flag di utilizzo, flag di binding o flag di accesso alla CPU.These restrictions are specified as usage flags, bind flags, or cpu access flags. In particolare, una risorsa può essere associata come input e come output contemporaneamente, purché la lettura e la scrittura della parte di una risorsa non possano avvenire nello stesso momento.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.

Quando si associa una risorsa, è opportuno considerare il modo in cui la GPU e la CPU accedono alla risorsa.When binding a resource, think about how the GPU and the CPU will access the resource. Le risorse progettate per un singolo scopo (non usare più flag di utilizzo, di binding e di accesso alla CPU) otterranno prestazioni migliori.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.

Si consideri ad esempio il caso di una destinazione di rendering utilizzata più volte come trama.For example, consider the case of a render target used as a texture multiple times. Potrebbe essere più veloce avere due risorse: una destinazione di rendering e una trama usata come risorsa dello shader.It may be faster to have two resources: a render target and a texture used as a shader resource. Ogni risorsa utilizzerebbe un solo flag di binding, che indica "destinazione di rendering" o "risorsa shader".Each resource would use only one bind flag, indicating "render target" or "shader resource". I dati verrebbero copiati dalla trama di destinazione di rendering alla trama dello shader.The data would be copied from the render-target texture to the shader texture.

Questa tecnica in questo esempio può migliorare le prestazioni isolando la scrittura della destinazione di rendering dalla lettura della trama dello shader.This technique in this example may improve performance by isolating the render-target write from the shader-texture read. L'unico modo per assicurarsi di implementare entrambi gli approcci e misurare la differenza di prestazioni nell'applicazione specifica.The only way to be sure is to implement both approaches and measure the performance difference in your particular application.

Argomenti correlatiRelated topics

RisorseResources