Partilhar via


Introdução ao Multithreading no Direct3D 11

Multithreading é projetado para melhorar o desempenho executando trabalho usando um ou mais threads ao mesmo tempo.

No passado, isso geralmente era feito gerando um único thread principal para renderização e um ou mais threads para fazer o trabalho de preparação, como criação de objetos, carregamento, processamento e assim por diante. No entanto, com a sincronização integrada no Direct3D 11, o objetivo por trás do multithreading é utilizar cada ciclo de CPU e GPU sem fazer um processador esperar por outro processador (particularmente não fazer a GPU esperar porque afeta diretamente a taxa de quadros). Ao fazer isso, podes gerar a maior quantidade de trabalho enquanto manténs a melhor taxa de quadros possível. O conceito de um único quadro para renderização não é mais tão necessário, uma vez que a API implementa a sincronização.

Multithreading requer alguma forma de sincronização. Por exemplo, se vários threads executados em um aplicativo precisarem acessar um único contexto de dispositivo (ID3D11DeviceContext), esse aplicativo deverá usar algum mecanismo de sincronização, como seções críticas, para sincronizar o acesso a esse contexto de dispositivo. Isso ocorre porque o processamento dos comandos de renderização (geralmente feito na GPU) e a geração dos comandos de renderização (geralmente feitos na CPU por meio da criação de objetos, carregamento de dados, alteração de estado, processamento de dados) geralmente usam os mesmos recursos (texturas, sombreadores, estado do pipeline e assim por diante). Organizar o trabalho em vários threads requer sincronização para impedir que um thread modifique ou leia dados que estão sendo modificados por outro thread.

Embora o uso de um contexto de dispositivo (ID3D11DeviceContext) não seja thread-safe, o uso de um dispositivo Direct3D 11 (ID3D11Device) é thread-safe. Como cada ID3D11DeviceContext é de subprocesso único, apenas um único subprocesso pode chamar um ID3D11DeviceContext de cada vez. Se vários threads precisarem acessar um único ID3D11DeviceContext, eles deverão usar algum mecanismo de sincronização, como seções críticas, para sincronizar o acesso a esse ID3D11DeviceContext. No entanto, múltiplos threads não são necessários para usar seções críticas ou primitivas de sincronização para aceder a um único ID3D11Device. Portanto, se um aplicativo usa ID3D11Device para criar objetos de recurso, esse aplicativo não é obrigado a usar a sincronização para criar vários objetos de recurso ao mesmo tempo.

O suporte a multithreading divide a API em duas áreas funcionais distintas:

O desempenho de multithreading depende do suporte do driver. Como: Verificar se há suporte ao driver fornece mais informações sobre como consultar o driver e o que os resultados significam.

O Direct3D 11 foi concebido de raiz para suportar multithreading. O Direct3D 10 implementa suporte limitado para multithreading usando a camada thread-safe. Esta página lista as diferenças de comportamento entre as duas versões do DirectX: Diferenças de encadeamento entre as versões do Direct3D.

Multithreading e DXGI

Apenas um thread de cada vez deve usar o contexto imediato. No entanto, seu aplicativo também deve usar esse mesmo thread para operações do Microsoft DirectX Graphics Infrastructure (DXGI), especialmente quando o aplicativo faz chamadas para o IDXGISwapChain::P resent método.

Observação

É inválido usar um contexto imediato simultaneamente com a maioria das funções da interface DXGI. Para os SDKs DirectX de março de 2009 e posteriores, as únicas funções DXGI seguras são AddRef, Releasee QueryInterface.

 

Para saber mais sobre como usar o DXGI com vários threads, veja Considerações sobre vários threads.

Multithreading