Цепочки буферов
Цепочки буферов управляют поворотом обратного буфера, формируя основу графической анимации.
Общие сведения
Модель программирования для цепочек буферов в 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Оптимации.
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.
Операции с данными выполняются в трехмерной очереди, предоставляемой при создании цепочки буферов, и приложения могут одновременно представлять несколько цепочек буферов, а также записывать и выполнять списки команд.
Если последняя часть графической работы (например, постобработка кадра) выполняется в очереди вычислений или не включает в себя очередь графики устройства, создание второй трехмерной очереди для представления может быть полезным и предотвратить задержку представления, задерживающую начало следующего кадра.
Пример
Следующий пример кода будет присутствовать в цикле отрисовки main:
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 отсутствуют, поэтому необходимо использовать предоставленный D3D12On7 id3D12CommandQueueDownLevel (запрашивается из прямой очереди команд) для представления.
Вы предоставляете открытый список команд методу Windows 7 present, который затем будет использоваться, закрываться и автоматически отправляться на устройство. Необходимо предоставить задний буфер, который должен быть создан приложением, должен быть зафиксированным ресурсом, должен быть одним образцом и должен иметь один из следующих форматов.
- 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