Rendering immediato e posticipato

Direct3D 11 supporta due tipi di rendering: immediato e posticipato. Entrambi vengono implementati usando l'interfaccia ID3D11DeviceContext .

Rendering immediato

Il rendering immediato si riferisce alla chiamata di API o comandi di rendering da un dispositivo, che accoda i comandi in un buffer per l'esecuzione nella GPU. Usare un contesto immediato per eseguire il rendering, impostare lo stato della pipeline e riprodurre un elenco di comandi.

Creare un contesto immediato usando D3D11CreateDevice o D3D11CreateDeviceAndSwapChain.

Rendering posticipato

Il rendering posticipato registra i comandi grafici in un buffer dei comandi in modo che possano essere riprodotti in un altro momento. Usare un contesto posticipato per registrare i comandi (rendering e l'impostazione dello stato) in un elenco di comandi. Il rendering posticipato è un nuovo concetto in Direct3D 11; il rendering posticipato è progettato per supportare il rendering in un thread durante la registrazione dei comandi per il rendering su thread aggiuntivi. Questa strategia parallela multithread consente di suddividere scene complesse in attività simultanee. Per altre informazioni sul rendering di scene complesse, vedere Rendering a più passaggi.

Creare un contesto posticipato usando ID3D11Device::CreateDeferredContext.

Direct3D genera un sovraccarico di rendering quando accoda i comandi nel buffer dei comandi. Al contrario, un elenco di comandi viene eseguito in modo molto più efficiente durante la riproduzione. Per usare un elenco di comandi, registrare i comandi di rendering con un contesto posticipato e riprodurli usando un contesto immediato.

È possibile generare un solo elenco di comandi in modo a thread singolo. Tuttavia, è possibile creare e usare più contesti posticipati contemporaneamente, ognuno in un thread separato. È quindi possibile usare questi più contesti posticipati per creare simultaneamente più elenchi di comandi.

Non è possibile riprodurre due o più elenchi di comandi contemporaneamente nel contesto immediato.

Per determinare se un contesto di dispositivo è immediato o posticipato, chiamare ID3D11DeviceContext::GetType.

Il metodo ID3D11DeviceContext::Map è supportato solo in un contesto posticipato per le risorse dinamiche (D3D11_USAGE_DYNAMIC) in cui viene D3D11_MAP_WRITE_DISCARD la prima chiamata all'interno dell'elenco di comandi. D3D11_MAP_WRITE_NO_OVERWRITE è supportato nelle chiamate successive, se disponibili per il tipo di risorsa specificato.

Le query in un contesto posticipato sono limitate alla generazione di dati e al disegno predicato. Non è possibile chiamare ID3D11DeviceContext::GetData in un contesto posticipato per ottenere dati su una query; è possibile chiamare GetData solo nel contesto immediato per ottenere i dati relativi a una query. È possibile impostare un predicato di rendering (un tipo di query) chiamando D3D11DeviceContext::SetPredication per usare i risultati delle query nella GPU. È possibile generare dati di query tramite chiamate a ID3D11DeviceContext::Begin e ID3D11DeviceContext::End. Tuttavia, i dati della query non saranno disponibili fino a quando non chiami ID3D11DeviceContext::ExecuteCommandList nel contesto immediato per inviare l'elenco dei comandi di contesto posticipato. I dati della query vengono quindi elaborati dalla GPU.

Multithreading