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


Переключение цепочек

Цепочки буферов управляют поворотом буфера назад, формируя основу графической анимации.

Обзор

Модель программирования для цепочек буферов в Direct3D 12 не идентична этой модели в более ранних версиях D3D. Удобство программирования, например, поддержка автоматической смены ресурсов, присутствующих в D3D10 и D3D11, больше не поддерживается. Автоматическое поворот ресурсов с поддержкой приложений для отрисовки одного и того же объекта API, а фактические поверхности, отрисовываемые, изменяют каждый кадр. Поведение цепочек буферов изменяется с Direct3D 12, чтобы другие функции Direct3D 12 имели низкую нагрузку на ЦП. Автоматический цветной ключ и многофакторная разметка не поддерживаются, хотя особенно растяжение и поворот по-прежнему.

Время существования буфера

Приложения могут хранить предварительно созданные дескрипторы, которые ссылаются на буферы обратной связи. Это позволяет гарантировать, что набор буферов, принадлежащих цепочке буферов, никогда не изменяется в течение всего времени существования цепочки буферов. Набор буферов, возвращаемых IDXGISwapChain::GetBuffer, не изменяется до вызова определенных API:

Порядок буферов, возвращаемых GetBuffer никогда не изменяется.

IDXGISwapChain3::GetCurrentBackBufferIndex возвращает индекс текущего буфера обратной части приложения.

Эффекты переключения

Единственными поддерживаемыми эффектами замены являются DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL и DXGI_SWAP_EFFECT_FLIP_DISCARD, что требует, чтобы число буферов было больше одного.

Переход между окнами и полноэкранными режимами

Direct3D 12 не поддерживает полноэкранный монопольный режим (FSE). Вместо этого, когда игра является единственным видимым приложением на экране, ОС использует стратегию, называемую полноэкранной оптимизацией (FSO), чтобы добиться аналогичного эффекта FSE без недостатков производительности. Дополнительные сведения об FSO см. в разделе Demystifying Fullscreen Optimisations.

Direct3D 12 поддерживает ограничение, которое приложения должны вызывать ResizeBuffers после перехода между окнами и полноэкранными режимами (сети буферов модели D3D11 имеют одинаковые ограничения).

Переходы IDXGISwapChain::SetFullscreenState не изменяют набор видимых приложений буферов в цепочке буферов. Только ResizeBuffers и вызовы ResizeTarget создают или уничтожают видимые приложения буферы. Однако в Direct3D 12 IDXGISwapChain::SetFullscreenState не входит в полноэкранный монопольный режим, а также просто изменяет разрешения и частоту обновления, чтобы разрешить оптимизацию полноэкранного экрана. Эти изменения можно вносить приложением без использования этого метода.

При вызове или IDXGISwapChain::P resent или IDXGISwapChain1::P resent, в D3D12_RESOURCE_STATE_PRESENT состоянии должен быть представлен обратный буфер. Презентация завершится ошибкой DXGI_ERROR_INVALID_CALL, если это не так.

Полноэкранные цепочки буферов продолжают иметь ограничение, которое необходимо вызвать до окончательного выпуска цепочки буферов SetFullscreenState (FALSE, NULL). SetFullscreenState(FALSE) успешно выполняется на устройствах Direct3D 12.

В 3D-очереди, предоставленной при создании цепочки буферов, выполняются операции, а приложения могут одновременно представлять несколько цепочек буферов, а также записывать и выполнять списки команд.

Когда последняя часть графической работы (например, после обработки кадров) выполняется в вычислительной очереди или не включает в себя очередь графики устройства, создание второй трехмерной очереди для представления может оказаться полезным и предотвратить задержку презентации с задержкой начала следующего кадра.

Пример

Следующий пример кода будет представлен в основном цикле отрисовки:

void Present()
{
    m_swapChain->Present(0, m_presentFlags);
    m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}

Создание цепочек буферов

При использовании CreateSwapChainForHwnd, CreateSwapChainForCoreWindowили вызовов CreateSwapChainForComposition обратите внимание, что pDevice параметр фактически требует указателя на прямую очередь команд в Direct3D 12, а не устройство.

Презентация в Windows 7

При выборе Direct3D 12 в Windows 7 необходимые типы DXGI для Direct3D 12 отсутствуют, поэтому для представления необходимо использовать указанный ID3D12CommandQueueDownLe vel (запрос от прямой очереди команд).

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

  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R10G10B10A2_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_B8G8R8X8_UNORM
  • DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB