Escolhendo um recursoChoosing a resource

Um recurso é uma coleção de dados que são usados pelo pipeline de 3D.A resource is a collection of data that is used by the 3D pipeline. Criar recursos e definir seu comportamento é o primeiro passo para programar seu app.Creating resources and defining their behavior is the first step toward programming your application. Este guia aborda tópicos básicos para escolher os recursos exigidos pelo seu app.This guide covers basic topics for choosing the resources required by your application.

Identificar os estágios de pipeline que precisam de recursosIdentify pipeline stages that need resources

A primeira etapa é escolher o estágio de pipeline gráfico (ou estágios) que usa um recurso.The first step is to choose the graphics pipeline stage (or stages) that will use a resource. Ou seja, identificar cada estágio que fará a leitura de dados de um recurso, bem como os estágios que gravarão dados em um 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. Conhecer os estágios de pipeline onde os recursos serão usados determina as APIs que serão chamadas para associar o recurso ao estágio.Knowing the pipeline stages where the resources will be used determines the APIs that will be called to bind the resource to the stage.

Esta tabela lista os tipos de recursos que podem ser associados a cada estágio do pipeline.This table lists the types of resources that can be bound to each pipeline stage. Ela inclui se o recurso pode ser vinculado como uma entrada ou uma saída.It includes whether the resource can be bound as an input or an output.

Estágio de pipelinePipeline Stage Entrada/saídaIn/Out RecursoResource Tipo de recursoResource Type
Assembler de entradaInput Assembler EmIn Buffer de vérticeVertex Buffer BufferBuffer
Assembler de entradaInput Assembler EmIn Buffer de índiceIndex Buffer BufferBuffer
Estágios de sombreadorShader Stages EmIn Shader-ResourceViewShader-ResourceView Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
Estágios de sombreadorShader Stages EmIn Buffer de constantes de sombreadorShader-Constant Buffer BufferBuffer
Saída de fluxoStream Output SaídaOut BufferBuffer BufferBuffer
Fusão de saídaOutput Merger SaídaOut Modo de exibição de destino de renderizaçãoRender-target View Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
Fusão de saídaOutput Merger SaídaOut Modo de exibição de estêncil/profundidadeDepth/Stencil View Texture1D, Texture2DTexture1D, Texture2D

 

Identificar como cada recurso será usadoIdentify how each resource will be used

Depois de escolher os estágios de pipeline que seu app usará (e, portanto, os recursos que cada estágio exigirá), a próxima etapa é determinar como cada recurso será usado, ou seja, se um recurso pode ser acessado por CPU ou 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.

O hardware em que seu app está sendo executado terá um mínimo de pelo menos uma CPU e uma GPU.The hardware that your application is running on will have a minimum of at least one CPU and one GPU. Para escolher um valor de uso, considere qual tipo de processador precisa ler ou gravar no recurso a partir das opções a seguir.To pick a usage value, consider which type of processor needs to read or write to the resource from the following options.

Uso de recursoResource Usage Pode ser atualizado porCan be updated by Frequência de atualizaçãoFrequency of Update
PadrãoDefault GPUGPU com pouca frequênciainfrequently
DinâmicoDynamic CPUCPU com frequênciafrequently
PreparoStaging GPUGPU N/Dn/a
ImutávelImmutable CPU (somente no momento da criação de recursos)CPU (only at resource creation time) N/Dn/a

 

O uso padrão deve ser usado para um recurso que deve ser atualizado pela CPU com pouca frequência (menor do que uma vez por quadro).Default usage should be used for a resource that is expected to be updated by the CPU infrequently (less than once per frame). Idealmente, a CPU nunca escreveria diretamente em um recurso com o uso padrão para evitar possíveis penalidades de desempenho.Ideally, the CPU would never write directly to a resource with default usage so as to avoid potential performance penalties.

O uso dinâmico deve ser usado para um recurso que a CPU atualiza relativamente com frequência (uma vez ou mais por quadro).Dynamic usage should be used for a resource that the CPU updates relatively frequently (once or more per frame). Um cenário típico para um recurso dinâmico seria criar buffers de índice e vértice dinâmico que podem ser preenchidos em tempo de execução com dados sobre a geometria visível do ponto de vista do usuário para cada quadro.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. Esses buffers seriam usados para renderizar somente a geometria visível ao usuário para esse quadro.These buffers would be used to render only the geometry visible to the user for that frame.

O uso de preparo deve ser usado para copiar dados de e para outros recursos.Staging usage should be used to copy data to and from other resources. Um cenário típico seria copiar dados em um recurso com o uso padrão (que a CPU não consegue acessar) para um recurso com o uso de preparo (que pode acessar a CPU).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).

Recursos imutáveis devem ser usados quando os dados no recurso não forem sofrer alteração.Immutable resources should be used when the data in the resource will never change.

Outra maneira de observar a mesma ideia é pensar o que um app faz com um recurso.Another way of looking at the same idea is to think of what an application does with a resource.

Como o app usa o recursoHow Application uses the Resource Uso de recursoResource Usage
Carregar uma vez e nunca atualizarLoad once and never update Imutável ou padrãoImmutable or Default
Aplicativo preenche recurso repetidamenteApplication fills resource repeatedly DinâmicoDynamic
Renderizar a texturaRender to texture PadrãoDefault
Acesso da CPU aos dados da GPUCPU access of GPU data PreparoStaging

 

Se você não tiver certeza de quais usos escolher, comece pelo uso do padrão, pois ele deve ser o caso mais comum.If you are unsure what usage to choose, start with the default usage as it is expected to be the most common case. Um buffer constante de sombreador é um tipo de recurso que sempre deve ter o uso padrão.A Shader-Constant buffer is the one resource type that should always have default usage.

Ligando recursos a estágios de pipelineBinding resources to pipeline stages

Um recurso pode ser associado a mais de um estágio de pipeline ao mesmo tempo, desde que sejam atendidas as restrições especificadas quando o recurso foi criado.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. Essas restrições são especificadas como sinalizadores de uso, sinalizadores de associação, ou sinalizadores de acesso de cpu.These restrictions are specified as usage flags, bind flags, or cpu access flags. Mais especificamente, um recurso pode ser vinculado como uma entrada e uma saída simultaneamente, contanto que a parte de leitura e gravação do recurso não possa ocorrer ao mesmo tempo.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.

Ao vincular um recurso, pense em como a GPU e a CPU terrão acesso ao recurso.When binding a resource, think about how the GPU and the CPU will access the resource. Os recursos projetados para uma única finalidade (não use vários sinalizadores de uso, associação, e de acesso de cpu) terão maior chance de resultar em melhor desempenho.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 exemplo, considere o caso de um destino de renderização usado como uma textura várias vezes.For example, consider the case of a render target used as a texture multiple times. Ele pode ser mais rápido com dois recursos: um destino de renderização e uma textura usada como um recurso do sombreador.It may be faster to have two resources: a render target and a texture used as a shader resource. Cada recurso usaria somente um sinalizador de associação, indicando o "destino de renderização" ou "recurso de sombreador".Each resource would use only one bind flag, indicating "render target" or "shader resource". Os dados seriam copiados da textura de destino de renderização para a textura do sombreador.The data would be copied from the render-target texture to the shader texture.

Essa técnica neste exemplo pode melhorar o desempenho, isolando a gravação de destino de renderização da leitura da textura de sombreador.This technique in this example may improve performance by isolating the render-target write from the shader-texture read. A única forma de ter certeza é implementando ambas as abordagens e medindo a diferença de desempenho em seu app específico.The only way to be sure is to implement both approaches and measure the performance difference in your particular application.

Tópicos relacionadosRelated topics

RecursosResources