Поделиться через


Немедленная и отложенная визуализация

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

Немедленная визуализация

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

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

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

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

Создайте отложенный контекст с помощью 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.

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