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 come la creazione di oggetti, il caricamento, l'elaborazione e così via. Tuttavia, con la sincronizzazione incorporata in Direct3D 11, l'obiettivo dietro il multithreading consiste nell'usare ogni ciclo CPU e GPU senza fare un'attesa del processore per un altro processore (in particolare non facendo attendere la GPU perché influisce direttamente sulla frequenza dei fotogrammi). A tale scopo, è possibile generare la maggior parte del lavoro mantenendo la migliore frequenza di fotogrammi. Il concetto di un singolo frame per il rendering non è più necessario poiché l'API implementa la sincronizzazione.

Il multithreading richiede una forma di sincronizzazione. Ad esempio, se più thread eseguiti in un'applicazione devono accedere a un singolo contesto di dispositivo (ID3D11DeviceContext), tale applicazione deve usare un meccanismo di sincronizzazione, ad esempio sezioni critiche, per sincronizzare l'accesso al contesto del 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 in più thread richiede la sincronizzazione per impedire a un thread di modificare o leggere i dati modificati da un altro thread.

Anche se l'uso di un contesto del dispositivo (ID3D11DeviceContext) non è thread-safe, l'uso di un dispositivo Direct3D 11 (ID3D11Device) è thread-safe. Poiché ogni ID3D11DeviceContext è a thread singolo, un solo thread può chiamare un ID3D11DeviceContext alla volta. Se più thread devono accedere a un singolo ID3D11DeviceContext, è necessario usare un meccanismo di sincronizzazione, ad esempio sezioni critiche, per sincronizzare l'accesso a tale ID3D11DeviceContext. Tuttavia, più thread non sono necessari per usare sezioni critiche o primitive di sincronizzazione per accedere a un singolo ID3D11Device. Pertanto, se un'applicazione usa ID3D11Device per creare oggetti risorsa, tale applicazione non è necessaria per usare la sincronizzazione per creare più oggetti di risorsa contemporaneamente.

Il supporto multithreading divide l'API in due aree funzionali distinte:

Le prestazioni di multithreading dipendono dal supporto del driver. Procedura: Verificare il supporto driver fornisce altre informazioni sull'esecuzione di query sul driver e sui risultati.

Direct3D 11 è stato progettato da zero per supportare il multithreading. Direct3D 10 implementa il 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 threading tra versioni Direct3D.

Multithreading e DXGI

Un solo thread alla volta deve usare il contesto immediato. Tuttavia, l'applicazione deve usare lo stesso thread 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, Release e QueryInterface.

 

Per altre informazioni sull'uso di DXGI con più thread, vedere Considerazioni su multithread.

Multithreading