Для повышения производительности используйте модель переключения DXGI

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

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

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

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

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

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

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

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

До 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, не рекомендуется переключаться на модель с переворотом, если только IDXGIFactory5::CheckFeatureSupport API доступно, и сообщается, что поддерживается DXGI_FEATURE_PRESENT_ALLOW_TEARING. Эта функция почти вездесущна в последних версиях Windows 10 и на современном оборудовании.

DirectFlip

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

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

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

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

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

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

Что еще нового в раскладной модели?

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

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

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

Цепочки обмена кадрами типа 'flip' имеют несколько дополнительных требований сверх цепочек обмена кадрами типа 'blt'.

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

Как выбрать правильные разрешения рендеринга и визуализации

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

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

Другие рекомендации

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