Немедленная и отложенная отрисовка

Direct3D 11 поддерживает два типа отрисовки: немедленную и отложенную. Оба метода реализуются с помощью интерфейса ID3D11DeviceContext .

Немедленная отрисовка

Немедленная отрисовка относится к вызову API-интерфейсов или команд отрисовки с устройства, которое помещает команды в очередь в буфер для выполнения на GPU. Используйте непосредственный контекст для отрисовки, задания состояния конвейера и воспроизведения списка команд.

Создайте непосредственный контекст с помощью D3D11CreateDevice или D3D11CreateDeviceAndSwapChain.

Отложенная отрисовка

Отложенная отрисовка записывает графические команды в буфер команд, чтобы их можно было воспроизвести в другое время. Используйте отложенный контекст для записи команд (отрисовки, а также настройки состояния) в список команд. Отложенная отрисовка — это новая концепция в Direct3D 11. отложенная отрисовка предназначена для поддержки отрисовки в одном потоке при записи команд для отрисовки в дополнительных потоках. Эта параллельная многопоточность позволяет разбить сложные сцены на параллельные задачи. Дополнительные сведения о отрисовке сложных сцен см. в разделе Многопродавная отрисовка.

Создайте отложенный контекст с помощью ID3D11Device::CreateDeferredContext.

Direct3D создает издержки отрисовки, когда он помещает команды в очередь в буфер команд. В отличие от этого, список команд выполняется гораздо эффективнее во время воспроизведения. Чтобы использовать список команд, записывайте команды отрисовки с отложенным контекстом и воспроизводите их с помощью немедленного контекста.

Вы можете создать только один список команд в однопотоковом режиме. Однако можно одновременно создавать и использовать несколько отложенных контекстов, каждый из которых содержится в отдельном потоке. Затем можно использовать эти несколько отложенных контекстов для одновременного создания нескольких списков команд.

Нельзя одновременно воспроизводить два или более списков команд в непосредственном контексте.

Чтобы определить, является ли контекст устройства непосредственным или отложенным, вызовите ID3D11DeviceContext::GetType.

Метод ID3D11DeviceContext::Map поддерживается только в отложенном контексте для динамических ресурсов (D3D11_USAGE_DYNAMIC), где первый вызов в списке команд D3D11_MAP_WRITE_DISCARD. D3D11_MAP_WRITE_NO_OVERWRITE поддерживается при последующих вызовах, если они доступны для заданного типа ресурса.

Запросы в отложенном контексте ограничены созданием данных и предикатным рисованием. Невозможно вызвать ID3D11DeviceContext::GetData в отложенном контексте для получения данных о запросе; Метод GetData можно вызывать только в непосредственном контексте, чтобы получить данные о запросе. Вы можете задать предикат отрисовки (тип запроса), вызвав D3D11DeviceContext::SetPredication для использования результатов запроса на GPU. Данные запроса можно создавать с помощью вызовов ID3D11DeviceContext::Begin и ID3D11DeviceContext::End. Однако данные запроса не будут доступны, пока вы не вызовете ID3D11DeviceContext::ExecuteCommandList в непосредственном контексте для отправки списка команд отложенного контекста. Затем данные запроса обрабатываются GPU.

Многопоточность