Presentation Model в Windows

Справка и основные термины

Для понимания материала важно разобраться в базовых понятиях:

  • DWM (Desktop Window Manager) – композитор рабочего стола Windows. Простыми словами: DWM берет картинки всех открытых окон, накладывает их друг на друга (композиция) и отправляет итоговый результат на вывод. Главный нюанс: DWM всегда работает с вертикальной синхронизацией, что добавляет как минимум один кадр задержки, если приложение проходит через него.
  • DXGI (DirectX Graphics Infrastructure) – это низкоуровневая подсистема, которая управляет перечислением адаптеров, созданием SwapChain и презентацией кадров. Начиная с DirectX 9Ex и во всех последующих API (DirectX 10, 11 и 12), именно DXGI отвечает за вывод изображения на экран. Исключением является только DirectX 9, который использует собственную, старую презентации и не умеет работать с DXGI напрямую.
  • SwapChain (цепочка буферов) — это механизм, с помощью которого Direct3D приложение выстраивает последовательность отрисованных кадров для вывода на дисплей. Возможно, вы слышали о двойной или тройной буферизации, вертикальной синхронизации (V-Sync). Все это – свойства DXGI SwapChain, наряду с разрешением кадрового буфера, форматом, цветовым пространством.

Presentation Model

Это определение механизма (пути) передачи отрендеренных кадров игры на дисплей.

В DXGI существует четыре различных swap-эффекта, которые игра может использовать для своей цепочки буферов: Discard (Flip), Sequential (Flip), Discard (BitBlt) и Sequential (BitBlt). Окончательный выбор сценария определяется используемым приложением SwapEffect и целым рядом оптимизаций.

Схема SwapEffect

Звучит немного запутанно, но суть в следующем: игра может настраивать разные swap effects для своей цепочки буферов swapchain. Swap Effect определяет, как именно отрисованный кадр должен выводиться на экран с точки зрения самой игры. Однако реальная модель представления, которая будет использована по факту, зависит от множества факторов, а не только от выбранного эффекта.

История Presentation Model

Windows 7

Во времена Windows 7 основными методами были оконный BitBlt и Полноэкранный Flipping. Долгие годы среди геймеров жило золотое правило: хочешь минимальный инпут-лаг и плавность – играй только в «Эксклюзивном полном экране».

Оконный режим был синонимом тормозов. Причина крылась в ограничениях модели BitBlt: вместо того чтобы попасть в DWM напрямую, игра использовала промежуточную поверхность для копирования кадра. Лишняя операция копирования – это лишняя нагрузка на видеопамять и заметная задержка, а еще плюсом сверху DWM добавлял кадр задержки композиции.

Схема SwapEffect Windows 7

FSE (Full-Screen Exclusive): В этом режиме игра брала управление выводом на себя, полностью обходя DWM. Композитор фактически переставал отрисовывать рабочий стол для этого монитора. Это давало максимальную скорость, но лишало возможности мгновенно сворачивать игру и использовать оконные оверлеи.

Революция Windows 8

С обновлением Windows 8 появился Оконный Flip. Вместо копирования кадра (как в BitBlt), система и приложения теперь просто обмениваются ссылками на области в видеопамяти. Это убрало лишнюю операцию копирования, но задержка самой композиции DWM всё еще оставалась.

Схема SwapEffect Windows 8

Вершина оптимизации DirectFlip и iFlip

Итогом этих улучшений стала технология DirectFlip. Она позволяет DWM «отступить на шаг назад» и пропустить кадр игры напрямую к контроллеру дисплея, минуя этап общей композиции DWM.

При удачной активации DirectFlip программа переключается в режим Independent Flip (iFlip Immediate*). Формально сохраняется оконный режим, однако по производительности и отклику это сопоставимо с классическим полноэкранным доступом (FSE).

* До Windows 10 даже после успешного прохождения DirectFlip и перехода в Independent Flip, игры не могли иметь разрывы как это было в FSE и были всегда под V-sync. Тиринг стал возможным благодаря True Immediate iFlip, который был добавлен в Windows 10.
Схема Dflip

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

Оптимизации Windows 10 и 11 для старых игр

Первая из них: FSO (Full-Screen Optimization) — функция, добавленная в Windows 10, которая выполняет очень важную задачу для пользователя: она преобразует любую игру, использующую полноэкранный эксклюзивный Flipping (FSE), в оконный Flip. Это преобразование позволяет использовать все преимущества independent flip. Ключевой особенностью работы FSO является эмуляция полноэкранного режима (eFSE), достигаемая за счет изменения системного разрешения и частоты обновления экрана в соответствии с требованиями запущенной игры. Так же может переобразовать старый D3D9 Fullscreen

Вторая: Optimizations for windowed games — функция, добавленна в Windows 11 22H2, которая переводит старые игры (DirectX 10-11 ), использующие оконный BitBlt, на современный оконный Flip. Это позволяет таким играм также воспользоваться всеми преимуществами independent flip. НЕ работает на D3D9

Следовательно, в современной Windows 11 со всеми оптимизациями модель оконного Flip применяется ко всем играм, работающим через DXGI. И если игра находится в independent flip, то она получает наилучшую производительность.

FSO

Multi-Plane Overlay

Multi-Plane Overlay (MPO) – подразумевает использование дополнительных выделенных аппаратных плоскостей сканирования в GPU, на которые могут подаваться кадры приложения, а видеокарта затем самостоятельно выводит их на дисплей, тем самым беря на себя работу композиции.

Это позволяет играм обходить DWM в различных смешанных и оконных режимах, тем самым устраняя задержку отображения, которая в противном случае возникла бы. С MPO вам не обязательно соблюдать правила активации стандартного DirectFlip.

MPO

Минимальные требования по видеокартам:

  • AMD: Radeon RX Vega (GCN 5.0)
  • Intel: HD Graphics 510-515 (Core 6th gen)
  • Nvidia: GTX 16/RTX 20 series (Turing)

Также поддержка зависит от конфигурации графического процессора и дисплея. Необычные настройки драйверов или дисплея могут отключить поддержку MPO, например, пользовательское масштабирование графического процессора (NIS/RSR/целочисленное и т. д.). Это мы разберем в отдельной теме с проблемами MPO и Composed:Flip.


Presentation Model на практике

Теперь, когда все оптимизации рассмотрены, давайте вернемся к анализу различных сценариев Presentation Model.

В схемах было сделано следующее упрощение: даже при включенной поддержке MPO на некоторых системах игра может по-прежнему отображаться как использующая «Hardware: Independent Flip», хотя в этом случае она, как правило, ведет себя и функционирует точно так же, как «Hardware Composed: Independent Flip».

Flip (D3D11/D3D12*)

FlipPM

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

Для игры, использующей свап эффект Flip, выбор конкретной модели представления зависит от нескольких факторов:


BitBlt (D3D11)

BitBlt

Для игры, использующей устаревший эффект BitBlt swap, выбор конкретной модели представления зависит от нескольких факторов:

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

В итоге

Все игры, работающие через DXGI (от DirectX 9Ex до DirectX 12), будут использовать Flip-модель презентации при условии, что у вас Windows 11 и включены ВСЕ Оптимизации.

При отсутствии аппаратной поддержки MPO — крайне важно следовать правилам для активации стандартного Direct Flip.

Наличие MPO дает вам полную свободу. Можете устанавливать любое разрешение, изменять область Swapchain приложения и накладывать оверлеи, при этом приложение продолжит стабильно работать в режиме Independent Flip.

Для старых проектов на базе классического DirectX 9 потребуется либо активация полноэкранного режима в сочетании с FSO, либо — что гораздо лучше — использование трансляторов DXVK или dgVoodoo2. Такой перевод на современный API позволит задействовать Flip-модель презентации и наслаждаться преимуществами оконного без рамок/полноэкранного режима вместо компромиссного FSO(eFSE).

Present Mode Описание
Hardware: Independent Flip Указывает на то, что приложение использует flip модель, не владеет экраном эксклюзивно, но все равно напрямую переключает отображаемую поверхность каждый кадр, минуя лишний этап DWM.
Hardware Composed:
Independent Flip*
Указывает на то, что приложение использует flip модель и ему выделена аппаратная плоскость наложения минуя лишний этап DWM.
Hardware: Legacy Flip Указывает на то, что приложение захватило полное управление экраном (эксклюзивный полноэкранный режим) и переключает отображаемую поверхность каждый кадр.
Composed: Flip Указывает на то, что приложение работает в оконном режиме, использует Flip модель и передает свои поверхности DWM для последующей композиции (1+ кадр задержки в любом случае).
Composed: Copy with GPU GDI Указывает на то, что приложение работает в оконном режиме и использует Bitblt (1+ кадр задержки в любом случае).

Режимы окна в современных играх

Не всегда игры называют их правильно, но вот список признаков, по которым вы сможете понять какой тип используется:

  1. Эмулированный Полноэкранный эксклюзивный(dx12) / игра через FSO — игра находится в оконном Flip, в котором рабочий стол Windows просто временно меняет разрешение, частоту обновления и цветовое пространство на те, что запросила игра. Полезно, если нет MPO и хочется играть в разрешении ниже рабочего стола. Создатели игр всё реже оставляют этот режим в настройках, поскольку он уступает обычному оконному.

  2. Полноэкранное окно — Окно игры масштабируется до разрешения системы. Самый лучший вариант для натива / для не натива если хочется растяг, но тогда MPO обязательно в этом случае.

  3. Безрамочное окно — Окно игры выводится как есть, без масштабирования и рамок (самый лучший вариант для натива).

  4. Рамочное окно — Игра выводится как обычное окно с рамками.

  5. Unity/Unreal Engine окно — Эти движки имеют особенный режим окна, в котором swapchain игры всегда зависим от системного разрешения. Изменение разрешения в настройках игры меняет разрешение рендера, но не swapchain. Поэтому в большинстве игр на UE нельзя сменить разрешение в оконном режиме.

Мониторинг Present mode

Для мониторинга лучшим вариантом будет RTSS.

  1. Скачиваем и устанавливаем актуальную версию RTSS с официального сайта

  2. Скачиваем файл оверлея и кидаем его в C:\Program Files (x86)\RivaTuner Statistics Server\Plugins\Client\Overlays

  3. Заходим в RTSS, нажимаем кнопку Setup: Кнопка Setup в RTSS
  4. Заходим на вкладку Plugins, ставим галочку на OverlayEditor и заходим в него, нажав два раза (или Setup снизу): Вкладка Plugins в RTSS
  5. Далее Layouts -> load -> выбираем скачанный .ovl: Загрузка файла ovl
  6. Закрываем OverlayEditor, нажимаем Apply и заходим в игру. Overlay

Presentation Model:

👍 Минимальная задержка если показывает

👎 Нежелательная задержка

Reflex Sim-to-Render latency — Отражает временной интервал между началом Simulation до завершения кадра GPU.
Также Reflex маркеры дают подробную информацию про pipeline игры от Sim до завершения Gpu Render, но не видят, что происходит на этапе композиции (Composite).

Схема Reflex Sim-to-Render latency

Present-To-Display — это время между вызовом функции Present() и изменением буфера кадра (отправкой на монитор).

Схема Present-To-Display Latency

Проверка работы MPO

  1. Скачиваем и устанавливаем SpecialK
  2. Запускаем SpecialK (SKIF), заходим во вкладку hardware
  3. Смотрим работает ли MPO
Проверка поддержки MPO в SpecialK

SKIF сразу предложит вам сбросить настройки в реестре, если вы наслушались оптимизаторов 😊
Нажав ПКМ по области MPO, вы можете сделать рефреш в реалтайме.

Контекстное меню MPO в SpecialK

Проверка в игре

Используя RTSS оверлей, откройте xbox game bar (Win+G), если игра осталась в independent flip — значит MPO работает.

Игра без MPO (Game Bar)

Без MPO

Игра с MPO (Game Bar)

С MPO

Проблемы MPO и Composed Flip

Если ваша видеокарта обладает аппаратной поддержкой MPO, но в SpecialK она не отображается — вероятнее всего, проблема вызвана одной из следующих причин:

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

(DL)Dsr


Поскольку (DL)DSR отключает MPO, крайне важно строго соблюдать правила стандартного DirectFlip.

Чтобы избежать режима composed:flip, обязательно устанавливайте (DL)DSR-разрешение в настройках Windows до запуска игры.

OpenGL/Vulkan на DXGI (WIP)

Нативно в Windows для Opengl и Vulkan игры есть два пути — Полноэкранный режим в FSE (Hardware:Lagacy flip) и Оконный режим в BitBlt (Copy: GPU GDI). То есть эти игры не работат на DXGI

Для пе

📚 Источники и полезные ссылки


×