Introdução a multithreading no Direct3D 11

O multithreading foi projetado para melhorar o desempenho executando o trabalho usando um ou mais threads ao mesmo tempo.

No passado, isso geralmente era feito gerando um único thread main para renderização e um ou mais threads para fazer trabalhos de preparação, como criação de objeto, carregamento, processamento e assim por diante. No entanto, com a sincronização interna no Direct3D 11, a meta por trás do multithreading é utilizar todos os ciclos de CPU e GPU sem fazer um processador esperar por outro processador (especialmente não fazer a GPU esperar porque afeta diretamente a taxa de quadros). Ao fazer isso, você pode gerar a maior quantidade de trabalho mantendo a melhor taxa de quadros. O conceito de um único quadro para renderização não é mais o necessário, pois 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 feitos 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 é threaded único, apenas um thread pode chamar um ID3D11DeviceContext por 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, vários threads não são necessários para usar seções críticas ou primitivos de sincronização para acessar um único ID3D11Device. Portanto, se um aplicativo usar ID3D11Device para criar objetos de recurso, esse aplicativo não precisará 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 multithreading depende do suporte ao driver. Como verificar o suporte ao driver fornece mais informações sobre como consultar o driver e o que os resultados significam.

O Direct3D 11 foi projetado desde o início para dar suporte ao 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 threading entre versões do Direct3D.

Multithreading e DXGI

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

Observação

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

 

Para obter mais informações sobre como usar o DXGI com vários threads, consulte Considerações multithread.

Multithread