Модель пролистывания DXGI

Windows 8 добавляет поддержку модели представления пролистывания и связанной с ней статистики в DXGI 1.2. Windows 8 модель презентации dxGI flip аналогична презентации Windows 7 direct3D 9EX Flip Mode. Приложения для презентаций на основе частоты видео или кадров, такие как игры, могут воспользоваться моделью презентации с отражением. Приложения, использующие модель представления пролистывания DXGI, снижают нагрузку системных ресурсов и повышают производительность. Приложения также могут использовать улучшения статистики с моделью представления пролистывания, чтобы лучше контролировать частоту презентации, предоставляя механизмы обратной связи и исправления в режиме реального времени.

Сравнение модели пролистывания DXGI и модели BitBlt

Среда выполнения использует передачу битовых блоков (bitblt) и модели представления пролистывания для представления графического содержимого на мониторах отображения. Самое большое различие между моделями представления bitblt и flip заключается в том, как содержимое буфера задней части добирается до Windows 8 DWM для композиции. В модели bitblt содержимое заднего буфера копируется в область перенаправления при каждом вызове IDXGISwapChain1::P resent1. В модели переворачивания все задние буферы совместно используются диспетчером окон рабочего стола (DWM). Таким образом, DWM может создавать прямо из этих резервных буферов без дополнительных операций копирования. Как правило, модель перелистывания эффективнее. Модель отражения также предоставляет больше возможностей, таких как улучшенная текущая статистика.

Если у вас есть устаревшие компоненты, использующие интерфейс Windows графических устройств (GDI) для записи в HWND напрямую, используйте модель bitblt.

Повышение производительности модели пролистывания DXGI имеет значительное значение, если приложение находится в окне. Последовательность в этой таблице и иллюстрация сравнивают использование пропускной способности памяти и системные операции чтения и записи оконных приложений, которые выбирают модель пролистывания и модель bitblt.

Шаг Модель BitBlt, представленная для DWM Модель пролистывания DXGI, представленная для DWM
1. Приложение обновляет кадр (запись)
Приложение обновляет кадр (запись)
2. Среда выполнения Direct3D копирует содержимое поверхности в область перенаправления DWM (чтение, запись)
Среда выполнения Direct3D передает поверхность приложения в DWM
3. После завершения копирования общей поверхности DWM отрисовывает поверхность приложения на экране (чтение, запись)
DWM отображает поверхность приложения на экране (чтение, запись)

 

illustration of a comparison of the blt model and the flip model

Модель переворачивания уменьшает использование памяти системы за счет уменьшения количества операций чтения и записи в среде выполнения Direct3D для окровавленной композиции кадров dwM.

Использование модели пролистывания DXGI

Приложения Direct3D 11.1, предназначенные для Windows 8 использовать модель переверки, создав цепочку буферов со значением перечисления DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, установленным в элементе SwapEffect структуры DXGI_SWAP_CHAIN_DESC1. При установке swapEffect значение DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL также задайте для этих элементов DXGI_SWAP_CHAIN_DESC1 указанные значения:

  • BufferCount в значение от 2 до 16, чтобы предотвратить снижение производительности в результате ожидания в DWM освобождения предыдущего буфера презентации.
  • Формат для DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM или DXGI_FORMAT_R8G8B8A8_UNORM
  • Число элементов структуры DXGI_SAMPLE_DESC , указанной элементом SampleDesc , а элемент качестваDXGI_SAMPLE_DESC равен нулю, так как несколько примеров антиализии (MSAA) не поддерживаются.

Если вы используете DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL в операционной системе Windows 7 или более ранней версии, создание устройства завершается ошибкой. При использовании модели пролистывания можно использовать полноэкранную статистику в окне. На полноэкранное поведение не влияет. Если передать значение NULL в параметр pFullscreenDescIDXGIFactory2::CreateSwapChainForHwnd для цепочки буферов с окнами и задать для swapEffectзначение DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, среда выполнения создает один дополнительный задний буфер и поворачивает любой дескриптор, принадлежащий буферу, который становится передним буфером во время презентации.

При использовании модели переворачивания учитывайте следующие советы:

  • Используйте одну цепочку буферов модели переворачивания на HWND. Не следует ориентироваться на несколько цепочек буферов модели переворачивания на один И тот же HWND.
  • Не используйте цепочку буферов модели пролистывания с функцией ScrollWindow или ScrollWindowEx GDI. Некоторые приложения Direct3D используют функции ScrollWindow и ScrollWindowEx GDI для обновления содержимого окна после возникновения события прокрутки пользователя. ScrollWindow и ScrollWindowEx выполняют битовые значения содержимого окна на экране, когда пользователь прокручивает окно. Для этих функций также требуются обновления модели bitblt для содержимого GDI и Direct3D. Приложения, использующие любую из функций, не обязательно будут отображать видимое содержимое окна, прокручиваемое на экране, когда приложение находится в окне. Рекомендуется не использовать функции ScrollWindow и ScrollWindowEx GDI, а вместо этого перерисовывать содержимое GDI и Direct3D на экране в ответ на прокрутку.
  • Используйте модель пролистывания в HWND , которая также не ориентирована на другие API, включая модель презентации DXGI bitblt, другие версии Direct3D или GDI. Так как модель bitblt поддерживает дополнительную копию поверхности, вы можете добавить GDI и другое содержимое Direct3D в ту же HWND с помощью поэтапного обновления из Direct3D и GDI. При использовании модели переворачивания отображаются только содержимое Direct3D в цепочках буферов модели переворачивания, которые среда выполнения передает в DWM. Среда выполнения игнорирует все другие обновления содержимого bitblt модели Direct3D или GDI.

Синхронизация кадров приложений модели пролистывания DXGI

Представленная статистика — это сведения о времени кадров, используемые приложениями мультимедиа для синхронизации видеопотоков и аудиопотоков и восстановления после сбоев воспроизведения видео. Приложения могут использовать сведения о времени кадров в текущей статистике, чтобы настроить частоту презентации своих видеокадров для более плавной презентации. Чтобы получить сведения о статистике, вызовите метод IDXGISwapChain::GetFrameStatistics , чтобы получить структуру DXGI_FRAME_STATISTICS . DXGI_FRAME_STATISTICS содержит статистику о вызовах IDXGISwapChain1::P resent1 . Цепочка буферов модели переворачивания предоставляет сведения о статистике как в окне, так и в полноэкранном режиме. Для цепочек буферов модели bitblt в оконном режиме все значения DXGI_FRAME_STATISTICS равны нулю.

Для модели отражения текущей статистики IDXGISwapChain::GetFrameStatistics возвращает DXGI_ERROR_FRAME_STATISTICS_DISJOINT в следующих ситуациях:

  • Первый вызов GetFrameStatistics, указывающий начало последовательности
  • Изменение режима: режим оконного режима до полноэкранного или полноэкранного перехода

Значения в элементах PresentRefreshCount, SyncRefreshCount и SyncQPCTimeDXGI_FRAME_STATISTICS имеют следующие характеристики:

  • Параметр PresentRefreshCount равен SyncRefreshCount , если приложение отображается на каждой виртуальной машине.
  • SyncRefreshCount получается в интервале vsync при отправке текущего, SyncQPCTime составляет приблизительно время, связанное с интервалом vsync.

Метод IDXGISwapChain::GetLastPresentCount возвращает последнее текущее число, то есть идентификатор последнего успешного вызова IDXGISwapChain1::P resent1 , связанного с цепочкой буферов. Этот идентификатор является значением элемента PresentCount структуры DXGI_FRAME_STATISTICS . Для цепочек буферов модели bitblt, в то время как в оконном режиме все DXGI_FRAME_STATISTICS значения равны нулю.

Предотвращение, обнаружение и восстановление после сбоев

Выполните следующие действия, чтобы избежать, обнаружить и восстановить сбои в презентации кадра:

  1. Вызовы IDXGISwapChain1::P resent1 (то есть вызов IDXGISwapChain1::P resent1 несколько раз, что приводит к их сбору в очереди).

  2. Создайте структуру текущей очереди для хранения всех успешно отправленных идентификаторов IDXGISwapChain1::P resent1 текущего идентификатора (возвращенного IDXGISwapChain::GetLastPresentCount) и связанных с ними вычисляемых или ожидаемых значений PresentRefreshCount .

  3. Чтобы обнаружить сбой, выполните приведенные далее действия.

    • Вызов IDXGISwapChain::GetFrameStatistics.
    • Для этого кадра получите идентификатор (PresentCount) и число виртуальных синхронизаций, где операционная система представила последнее изображение монитору (PresentRefreshCount).
    • Получите ожидаемый Параметр PresentRefreshCount , связанный с указанным идентификатором и ранее сохраненный в структуре текущей очереди.
    • Если фактическое значение PresentRefreshCount позже ожидаемого PresentRefreshCount, произошло сбой.
  4. Чтобы восстановиться после сбоя, выполните следующие действия.

    • Вычислите количество кадров, которые необходимо пропустить для восстановления после сбоя. Например, если шаг 3 показывает, что ожидаемое число виртуальных синхронизаций (PresentRefreshCount) для текущего идентификатора (PresentCount) равно 5, а фактическое число виртуальных синхронизаций для текущего идентификатора — 8, количество кадров, которые необходимо пропустить для восстановления после сбоя, равно 3 кадрам.

    • Передайте значение 0 в параметр SyncInterval в этом числе вызовов IDXGISwapChain1::P resent1 , чтобы отменить и пропустить это число кадров.

      Примечание

      Если сбой состоит из большого количества кадров, вызовите IDXGISwapChain1::P resent1 с параметром Flags , установленным для DXGI_PRESENT_RESTART , чтобы отменить и пропустить все незавершенные в очереди подарки.

       

Ниже приведен пример сценария восстановления после сбоев в презентации кадра:

illustration of an example scenario of recovering from glitches in frame presentation

В примере сценария предполагается, что кадр A будет отображаться на экране в количестве виртуальных синхронных значений 1. Но на самом деле вы обнаружите число виртуальных синхронизаций, которое кадр A отображается на экране как 4. Поэтому вы определяете, что произошел сбой. Затем можно отменить 3 кадра, то есть передать 0 в параметр SyncInterval в 3 вызовах IDXGISwapChain1::P resent1. В предыдущем примере сценария для восстановления после сбоя требуется всего 8 вызовов IDXGISwapChain1::P resent1 . Затем 9-й кадр отображается согласно ожидаемому количеству виртуальных синхронизаций.

Ниже приведена строка времени событий презентации. Каждая вертикальная линия представляет vsync. Горизонтальное направление — это время, которое увеличивается справа. Вы можете использовать рисунок, чтобы представить, как могут возникнуть сбои.

illustration of a time line of presentation eventsl

На рисунке показана следующая последовательность:

  1. Приложение просыпается на vsync, отрисовывает синий цвет, вызывает IDXGISwapChain1::P resent1, а затем возвращается в спящий режим.

  2. Графический модуль обработки (GPU) просыпается из простоя, выполняет отрисовку в синий, а затем возвращается в спящий режим.

  3. DwM просыпается в следующей виртуальной синхронизации, состоит из синего в задний буфер, вызывает IDXGISwapChain1::P resent1, а затем возвращается в спящий режим.

  4. Приложение просыпается, отображает зеленый цвет, вызывает IDXGISwapChain1::P resent1, а затем возвращается в спящий режим.

    Примечание

    Приложение выполняется параллельно, пока GPU выполняет синий цвет.

     

  5. Затем GPU отрисовывает зеленый цвет для приложения.

  6. Наконец, цифровой аналоговый преобразователь (DAC) показывает результаты композиции DWM на мониторе на следующей виртуальной синхронизации.

Из временной строки можно представить задержку текущей статистики и способ возникновения сбоев. Например, чтобы показать сбой DWM для зеленого цвета, отображаемого на экране, представьте, что расширение зеленой или красной рамки, чтобы правая сторона зеленого или красного поля совпадала с правой стороной фиолетового или красного прямоугольника. В этом сценарии приложение уровня данных отображает два кадра синего цвета, а затем зеленый кадр. Вы можете увидеть, что этот сбой произошел при чтении текущей статистики.

Улучшение презентации с помощью модели перелистывания, грязных прямоугольников и прокрученных областей