Introduzione al multithreading in Direct3D 11
Il multithreading è progettato per migliorare le prestazioni eseguendo il lavoro usando uno o più thread contemporaneamente.
In passato, questa operazione è stata spesso eseguita generando un singolo thread principale per il rendering e uno o più thread per eseguire operazioni di preparazione, ad esempio la creazione di oggetti, il caricamento, l'elaborazione e così via. Tuttavia, con la sincronizzazione integrata in Direct3D 11, l'obiettivo alla base del multithreading è quello di usare ogni ciclo di CPU e GPU senza fare un'attesa del processore per un altro processore (in particolare non rendendo attesa la GPU perché influisce direttamente sulla frequenza dei fotogrammi). In questo modo, è possibile generare la maggior parte del lavoro mantenendo al tempo stesso la migliore frequenza dei fotogrammi. Il concetto di singolo frame per il rendering non è più necessario perché l'API implementa la sincronizzazione.
Il multithreading richiede una qualche forma di sincronizzazione. Ad esempio, se più thread eseguiti in un'applicazione devono accedere a un singolo contesto di dispositivo (ID3D11DeviceContext), l'applicazione deve usare un meccanismo di sincronizzazione, ad esempio sezioni critiche, per sincronizzare l'accesso a tale contesto di dispositivo. Ciò è dovuto all'elaborazione dei comandi di rendering (in genere eseguiti sulla GPU) e alla generazione dei comandi di rendering (in genere eseguiti sulla CPU tramite la creazione di oggetti, il caricamento dei dati, la modifica dello stato, l'elaborazione dei dati) spesso usano le stesse risorse (trame, shader, stato della pipeline e così via). L'organizzazione del lavoro tra più thread richiede la sincronizzazione per impedire a un thread di modificare o leggere i dati modificati da un altro thread.
Mentre l'uso di un contesto di dispositivo (ID3D11DeviceContext) non è thread-safe, l'uso di un dispositivo Direct3D 11 (ID3D11Device) è thread-safe. Poiché ogni ID3D11DeviceContext è a thread singolo, solo un thread può chiamare un ID3D11DeviceContext alla volta. Se più thread devono accedere a un singolo ID3D11DeviceContext, devono usare un meccanismo di sincronizzazione, ad esempio sezioni critiche, per sincronizzare l'accesso a tale ID3D11DeviceContext. Tuttavia, non è necessario che più thread usino sezioni critiche o primitive di sincronizzazione per accedere a una singola ID3D11Device. Pertanto, se un'applicazione usa ID3D11Device per creare oggetti risorsa, tale applicazione non è necessaria per usare la sincronizzazione per creare più oggetti risorsa contemporaneamente.
Il supporto del multithreading divide l'API in due aree funzionali distinte:
Le prestazioni del multithreading dipendono dal supporto del driver. Procedura: Verificare la presenza di supporto driver fornisce altre informazioni sull'esecuzione di query sul driver e sul significato dei risultati.
Direct3D 11 è stato progettato da zero per supportare il multithreading. Direct3D 10 implementa un supporto limitato per il multithreading usando il livello thread-safe . Questa pagina elenca le differenze di comportamento tra le due versioni di DirectX: Differenze di gestione dei thread nelle versioni di Direct3D.
Multithreading e DXGI
Un solo thread alla volta deve usare il contesto immediato. Tuttavia, l'applicazione deve usare lo stesso thread anche per le operazioni DXGI (Microsoft DirectX Graphics Infrastructure), soprattutto quando l'applicazione effettua chiamate al metodo IDXGISwapChain::P resent.
Nota
Non è valido usare un contesto immediato simultaneamente con la maggior parte delle funzioni di interfaccia DXGI. Per gli SDK DirectX di marzo 2009 e versioni successive, le uniche funzioni DXGI sicure sono AddRef, Releasee QueryInterface.
Per altre informazioni sull'uso di DXGI con più thread, vedere Considerazioni su multithread.
Argomenti correlati