Для оптимальной производительности используйте модель флип-флип DXGI

В этом разделе приводятся рекомендации разработчика по повышению производительности и эффективности стека презентаций в современных версиях Windows. Он выбирает, где модель флипов DXGI, DirectX 12: режимы презентации в Windows 10 (видео) и улучшения презентации в Windows 10: ранний вид (видео) остался.

Призыв к действию

Если вы по-прежнему используете DXGI_SWAP_EFFECT_DISCARD или DXGI_SWAP_EFFECT_SEQUENTIAL (например, "blt" представленная модель), пришло время остановиться!

Переключение на DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL или DXGI_SWAP_EFFECT_FLIP_DISCARD (например, модель переверки) обеспечит более высокую производительность, снижение энергопотребления и обеспечит более широкий набор функций. (Дополнительные сведения об этих значениях см. в DXGI_SWAP_EFFECT перечислении .)

Модель перелистывания показывает, как сделать режим окна фактически эквивалентным или лучше по сравнению с классическим "полноэкранным монопольным" режимом. На самом деле, вы можете пересмотреть, требуется ли приложению полноэкранный монопольный режим, так как преимущества безграничного окна модели отражения включают более быстрое Alt-Tab переключение и лучшую интеграцию с современными функциями отображения.

Почему их нужно использовать сегодня? До обновления за апрель 2018 г. модель blt может привести к видимому разрыву при использовании в гибридных конфигурациях GPU, которые часто встречаются в высокопроизводительных ноутбуках (см. статью базы знаний 3158621). В обновлении за апрель 2018 года эта слезоточивая работа была исправлена за счет некоторых дополнительных работ. Если вы выполняете blt-представления с высокой частотой кадров в гибридных GPU, особенно при высоких разрешениях, таких как 4K, эта дополнительная работа может повлиять на общую производительность. Чтобы обеспечить оптимальную производительность в этих системах, переключитесь с blt на модель с отражением. Кроме того, рассмотрите возможность уменьшения разрешения цепочки буферов, особенно если это не основная точка взаимодействия с пользователем (как это часто бывает с окнами предварительной версии виртуальной реальности).

Краткая история

Что такое модель перелистывания? Что такое альтернатива?

До Windows 7 единственным способом представления содержимого из D3D было "blt" или скопировать его в поверхность, принадлежающую окну или экрану. Начиная с эффекта буфера FLIPEX D3D9 и переходом к DXGI через эффект переключения FLIP_SEQUENTIAL в Windows 8, мы разработали более эффективный способ поместить содержимое на экран, предоставив ему общий доступ непосредственно с компостатором рабочего стола с минимальными копиями. Общие сведения о технологии см. в модели перелистывания DXGI .

Эта оптимизация возможна благодаря DWM (диспетчер окон рабочего стола), который является компостором, который управляет Windows рабочим столом.

Когда следует использовать модель blt?

Существует одна часть функциональности, которую модель переворачивания не предоставляет: возможность иметь несколько различных API-интерфейсов, создающих содержимое, которое все слои вместе в одном HWND, на текущей основе. Примером этого будет использование D3D для рисования фона окна, а затем Windows GDI, чтобы нарисовать что-то сверху, или с помощью двух разных графических API или двух буферов из одного API для создания чередующихся кадров. Если вам не требуется взаимодействие на уровне HWND между графическими компонентами, вам не нужна модель blt.

Существует вторая часть функциональности, которая не была предоставлена в исходном макете модели перелистывания, но доступна сейчас, что является возможностью представить на неразрешимой частоте кадров. Для приложения, использующего интервал синхронизации 0, не рекомендуется переключаться на модель переключения, если не доступен API IDXGIFactory5::CheckFeatureSupport , а также поддержка отчетов для DXGI_FEATURE_PRESENT_ALLOW_TEARING. Эта функция почти повсеместно используется в последних версиях Windows 10 и на современном оборудовании.

DirectFlip

Если вы смотрели DirectX 12: Режимы презентации в Windows 10, вы увидите разговоры о "Прямой флип" и "Независимый флип". Это оптимизации, которые включены для приложений с помощью буферов модели flip. В зависимости от конфигурации окна и буфера можно полностью обойти состав рабочего стола и напрямую отправлять кадры приложений на экран так же, как и монопольный полноэкранный режим.

В эти дни эти оптимизации могут участвовать в одном из 3 сценариев, чтобы увеличить функциональные возможности:

  1. DirectFlip: буферы цепочки буферов соответствуют измерениям экрана, а клиентский регион окна охватывает экран. Вместо использования цепочки буферов DWM для отображения на экране используется цепочка буферов приложений.
  2. DirectFlip со средствами настройки панели: клиентский регион окна охватывает экран, а буферы цепочки буферов находятся в пределах определенного аппаратно-зависимого коэффициента масштабирования (например, от 0,25 до 4x) экрана. Оборудование сканирования GPU используется для масштабирования буфера при отправке его на дисплей.
  3. DirectFlip с многоуровневой наложением (MPO): буферы цепочки буферов находятся в некоторых аппаратных коэффициентах масштабирования измерений окна. DWM может зарезервировать выделенный аппаратный уровень сканирования для приложения, который затем сканируется и потенциально растянут до альфа-смешиваемой подзоны экрана.

С помощью модели перевернутого окна приложение может запрашивать поддержку оборудования для различных сценариев DirectFlip и реализовывать различные типы динамического масштабирования с помощью IDXGIOutput6::CheckHardwareCompositionSupport. Одна из предостережений заключается в том, что если используется монтажная панель, то курсор может страдать растянутыми побочными эффектами, которые указываются через DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED.

Как только цепочка буферов будет "DirectFlipped", DWM может перейти в спящий режим и только просыпаться, когда что-то меняется за пределами приложения. Кадры приложений отправляются непосредственно на экран независимо друг от друга с той же эффективностью, что и полноэкранный эксклюзив. Это "Независимый флип", и может участвовать во всех описанных выше сценариях. Если другое содержимое рабочего стола поверх, DWM может либо легко перейти в составной режим, эффективно "обратное создание" содержимого поверх приложения, прежде чем перевернуть его, или использовать MPO для поддержания независимого режима перелистывания.

Ознакомьтесь со средством PresentMon , чтобы получить представление о том, какой из указанных выше элементов использовался.

Что еще нового в модели перелистывания?

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

  • Уменьшение задержки с помощью DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. В режиме независимого перелистывания можно получить до 1 кадра задержки в последних версиях Windows с корректной откатом к минимально возможному при составлении.
    • Предостережение: возникла проблема, которая дала минимум два кадра задержки в юбилейном обновлении Windows 10 и более ранних версий. Дополнительные сведения см. в этом разделе форума . Это исправлено в обновлении Fall Creator's Update.
  • DXGI_SWAP_EFFECT_FLIP_DISCARD включает режим обратной композиции прямого перелистывания, что приводит к меньшей общей работе для отображения рабочего стола. DWM может скрестить буферы приложений и отправлять их на экран, а не выполнять полную копию в собственные цепочки буферов.
  • DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING может включать даже меньшую задержку, чем ожидающий объект, даже в окне в системах с поддержкой многоуровневого наложения.
  • Приложения имеют контроль над масштабированием содержимого, которое происходит во время изменения размера окна, используя набор свойств DXGI_SCALING во время создания цепочки буферов.
  • Содержимое в форматах HDR (R10G10B10A2_UNORM или R16G16B16A16_FLOAT) не зажато, если только оно не состоит в рабочем столе SDR.
  • Представленная статистика доступна в окне.
  • Существует более высокая совместимость с моделью приложения UWP (универсальная платформа Windows) и DX12, так как они совместимы только с моделью перелистывания.

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

К цепочкам буферов модели Flip предъявляют несколько дополнительных требований поверх цепочки буферов blt:

  1. Число буферов должно быть не менее 2.
  2. После выполнения вызовов обратный буфер должен быть явно привязан к немедленному контексту D3D11, прежде чем его можно будет использовать снова.
  3. После вызова SetFullscreenState приложение должно вызывать ResizeBuffers до present.
  4. Цепочки буферов MSAA (многофакторная защита от псевдонимов) не поддерживаются непосредственно в модели перелистывания, поэтому приложению потребуется выполнить разрешение MSAA перед выдачей present.

Выбор правильных разрешений отрисовки и презентаций

Традиционным шаблоном для приложений в прошлом было предоставление пользователю списка разрешений для выбора, когда пользователь выбирает монопольный полноэкранный режим. Благодаря возможности современных дисплеев легко начать масштабирование содержимого, рассмотрите возможность выбора разрешения отрисовки для масштабирования производительности, независимо от разрешения выходных данных и даже в окне. Кроме того, приложения должны использовать IDXGIOutput6::CheckHardwareCompositionSupport , чтобы определить, нужно ли масштабировать содержимое перед его представлением или позволить оборудованию выполнять масштабирование.

Содержимое может потребоваться перенести с одного GPU на другой в рамках текущей операции или операции композиции. Это часто верно на ноутбуках с несколькими GPU или системах с внешними GPU, подключенными к сети. По мере того как эти конфигурации становятся более распространенными, и по мере увеличения числа дисплеев с высоким разрешением стоимость представления цепочки буферов полного разрешения увеличивается. Если целевой объект цепочки буферов не является основной точкой взаимодействия с пользователем, как это часто бывает с заголовками виртуальной реальности, которые представляют двухмерный предварительный просмотр сцены виртуальной реальности в дополнительном окне, рассмотрите возможность использования цепочки буферов с более низким разрешением, чтобы свести к минимуму объем пропускной способности, который необходимо передать по разным GPU.

Другие замечания

При первом запросе GPU на запись в буфер цепочки буферов — это время, когда GPU застопорится, пока буфер станет доступным. По возможности отложите эту точку насколько это возможно.