Поделиться через


Для повышения производительности используйте модель переверки 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 (a.k.a. модель переверки) обеспечит более высокую производительность, снижение энергопотребления и более широкий набор функций. (Дополнительные сведения об этих значениях см. в DXGI_SWAP_EFFECT перечислении.)

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

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

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

  1. DirectFlip: буферы цепочки буферов соответствуют измерениям экрана, а клиентский регион окна охватывает экран. Вместо использования цепочки буферов DWM для отображения на экране используется цепочка буферов приложений.
  2. DirectFlip с средствами настройки панели: клиентский регион окна охватывает экран, а буферы цепочки буферов находятся в пределах некоторых аппаратных зависимых коэффициентов масштабирования (например, 0,25x до 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, так как они совместимы только с моделью переверки.

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

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

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

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

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

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

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

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