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

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

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

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

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

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

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

Краткий журнал

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

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

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

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

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

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

DirectFlip

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

В настоящее время эти оптимизации могут выполняться в одном из трех сценариев в порядке увеличения функциональности:

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

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

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

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

Что еще нового в модели flip?

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

  • Уменьшение задержки с помощью 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.

Что нужно сделать, чтобы использовать модель flip?

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

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

Выбор правильного разрешения для отрисовки и презентации

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

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

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

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