Freigeben über


Um optimale Leistung zu erzielen, verwenden Sie das DXGI-Flip-Modell

Dieses Thema enthält Entwickleranleitungen zum Maximieren der Leistung und Effizienz im Präsentationsstapel in modernen Versionen von Windows. Es wird aufgenommen, wo DXGI Flip-Modell, DirectX 12: Präsentationsmodi in Windows 10 (Video)und Präsentationsverbesserungen in Windows 10: Ein frühes Aussehen (Video) verlassen.

Handlungsaufruf

Wenn Sie noch DXGI_SWAP_EFFECT_DISCARD oder DXGI_SWAP_EFFECT_SEQUENTIAL verwenden (z.B. das "blt"-Modell), ist es an der Zeit, zu stoppen!

Der Wechsel zu DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_DISCARD (z. B. das Flip-Modell) bietet eine bessere Leistung, einen geringeren Stromverbrauch und bietet eine umfangreichere Reihe von Features. (Weitere Informationen zu diesen Werten finden Sie unter DXGI_SWAP_EFFECT Enumeration.)

Flip-Modell präsentiert sich so weit, dass der Fenstermodus im Vergleich zum klassischen Modus "Vollbild exklusiv" effektiv gleichwertig oder besser ist. Tatsächlich möchten Sie vielleicht überdenken, ob Ihre Anwendung tatsächlich einen vollbildfreien Modus benötigt, da die Vorteile eines flip-Modellrahmenfensters schnellere Alt-Tab Wechseln und eine bessere Integration mit modernen Anzeigefeatures umfassen.

Warum jetzt? Vor dem Update vom April 2018 könnte das blt-Modell zu sichtbaren Zerrissen führen, wenn es bei hybriden GPU-Konfigurationen verwendet wird, die häufig in High-End-Laptops zu finden sind (siehe KB 3158621). Im Update vom April 2018 wurde dieser Abriss behoben, zu den Kosten einiger zusätzlicher Arbeit. Wenn Sie blt bei hohen Frameraten über Hybrid-GPUs hinweg präsentieren, insbesondere bei hohen Auflösungen wie 4K, kann sich diese zusätzliche Arbeit auf die Gesamtleistung auswirken. Um eine optimale Leistung auf diesen Systemen zu gewährleisten, wechseln Sie vom Blt zum Flip Present-Modell. Darüber hinaus sollten Sie die Auflösung Ihrer Swapchain reduzieren, insbesondere, wenn sie nicht der primäre Punkt der Benutzerinteraktion ist (wie häufig bei VR-Vorschaufenstern).

Eine kurze Geschichte

Was ist das Flip-Modell? Was ist die Alternative?

Vor Windows 7 bestand die einzige Möglichkeit zum Präsentieren von Inhalten von D3D darin, inhalte zu "blt" oder in eine Oberfläche zu kopieren, die im Besitz des Fensters oder Bildschirms war. Ab dem FLIPEX-Swapeffekt von D3D9 und dem Wechseleffekt von DXGI über den FLIP_SEQUENTIAL Swap-Effekt in Windows 8 haben wir eine effizientere Möglichkeit entwickelt, Inhalte auf dem Bildschirm zu platzieren, indem wir sie direkt mit dem Desktopkompositor mit minimalen Kopien teilen. Eine allgemeine Übersicht über die Technologie finden Sie unter DXGI Flip Model.

Diese Optimierung ist möglich durch den DWM (Desktop Window Manager), der der Kompositor ist, der den Windows-Desktop steuert.

Wann sollte ich das Blt-Modell verwenden?

Es gibt eine Funktionalität, die das Flip-Modell nicht bietet: die Möglichkeit, mehrere verschiedene APIs zu erstellen, die Inhalte erzeugen, die alle in demselben HWND-auf einer vorhandenen Basis übereinander angeordnet sind. Ein Beispiel hierfür wäre die Verwendung von D3D zum Zeichnen eines Fensterhintergrunds und dann Windows GDI, um etwas oben zu zeichnen, oder zwei verschiedene Grafik-APIs oder zwei Swapchains aus derselben API zu verwenden, um abwechselnde Frames zu erzeugen. Wenn Sie nicht HWNDInterop zwischen Grafikkomponenten benötigen, benötigen Sie kein Blt-Modell.

Es gibt eine zweite Funktionalität, die nicht im ursprünglichen Flip-Modelldesign bereitgestellt wurde, aber jetzt verfügbar ist, was die Möglichkeit ist, bei einer nicht gedrosselten Framerate darzustellen. Für eine Anwendung mit Synchronisierungsintervall 0 wird nicht empfohlen, zum Flip-Modell zu wechseln, es sei denn, die IDXGIFactory5::CheckFeatureSupport-API ist verfügbar und meldet unterstützung für DXGI_FEATURE_PRESENT_ALLOW_TEARING. Dieses Feature ist nahezu überall auf den neuesten Versionen von Windows 10 und auf moderner Hardware verfügbar.

DirectFlip

Wenn Sie DirectX 12: Präsentationsmodi in Windows 10angesehen haben, werden Sie über "Direct Flip" und "Independent Flip" sprechen. Dies sind Optimierungen, die für Anwendungen mit Flip-Modell-Swapchains aktiviert sind. Je nach Fenster- und Pufferkonfiguration ist es möglich, die Desktopkomposition vollständig zu umgehen und anwendungsframes direkt an den Bildschirm zu senden, auf die gleiche Weise wie der exklusive Vollbildmodus.

In diesen Tagen können diese Optimierungen in einem von drei Szenarien interagieren, um die Funktionalität zu erhöhen:

  1. DirectFlip-: Ihre Swapchainpuffer stimmen mit den Bildschirmabmessungen überein, und der Fensterclientbereich deckt den Bildschirm ab. Anstatt die DWM-Swapchain zum Anzeigen auf dem Bildschirm zu verwenden, wird die Anwendungs-Swapchain verwendet.
  2. DirectFlip mit Panel-Fittern: Der Fensterclientbereich deckt den Bildschirm ab, und Ihre Swapchainpuffer befinden sich innerhalb eines hardwareabhängigen Skalierungsfaktors (z. B. 0,25x bis 4x) des Bildschirms. Die GPU-Scanouthardware wird verwendet, um den Puffer beim Senden an die Anzeige zu skalieren.
  3. DirectFlip mit MPO (Multi-Plane Overlay): Ihre Swapchainpuffer befinden sich innerhalb eines hardwareabhängigen Skalierungsfaktors Ihrer Fensterabmessungen. Der DWM kann eine dedizierte Hardware-Scanoutebene für Ihre Anwendung reservieren, die dann ausgescannt und potenziell auf einen Alpha-gemischten Teilbereich des Bildschirms gestreckt wird.

Mit dem fensterbasierten Flip-Modell kann die Anwendung Hardwareunterstützung für verschiedene DirectFlip-Szenarien abfragen und verschiedene Arten dynamischer Skalierung über die Verwendung von IDXGIOutput6::CheckHardwareCompositionSupportimplementieren. Eine Einschränkung, die Sie beachten sollten, ist, dass bei Verwendung von Panel-Fittern der Cursor über DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHEDdehnende Nebenwirkungen leiden kann.

Sobald Ihre Swapchain "DirectFlipped" war, kann der DWM in den Ruhezustand wechseln und nur dann wachen, wenn sich etwas außerhalb Ihrer Anwendung ändert. Ihre Anwendungsframes werden unabhängig voneinander direkt an den Bildschirm gesendet, mit der gleichen Effizienz wie Vollbild exklusiv. Dies ist "Unabhängiges Kippen" und kann sich an allen oben genannten Szenarien beteiligen. Wenn andere Desktopinhalte oben angezeigt werden, kann der DWM entweder nahtlos in den zusammengesetzten Modus zurückwechseln, den Inhalt vor dem Kippen effizient "verfassen" oder MPO nutzen, um den unabhängigen Flipmodus beizubehalten.

Sehen Sie sich das PresentMon Tool an, um Einblicke zu erhalten, welche der oben genannten Tools verwendet wurden.

Was ist noch neu im Flip-Modell?

Zusätzlich zu den oben genannten Verbesserungen, die für Standard-Swapchains ohne etwas Besonderes gelten, gibt es mehrere Features für Flip-Modellanwendungen zu verwenden:

  • Verringern der Latenz mit DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. Wenn Sie sich im Modus "Unabhängiges Kippen" befinden, können Sie auf 1 Frame der Latenz in den letzten Versionen von Windows zurückgreifen, wobei bei der Erstellung ein ordnungsgemäßer Fallback auf das Minimum möglich ist.
    • Vorbehalt: Es gab ein Problem, das mindestens zwei Frames der Latenz im Windows 10 Anniversary Update und früher gab. Weitere Informationen finden Sie diesem Forumthema. Dies wurde im Fall Creator es Update behoben.
  • DXGI_SWAP_EFFECT_FLIP_DISCARD ermöglicht den Modus "Umgekehrte Komposition" des direkten Flips, was zu weniger Gesamtarbeit führt, um den Desktop anzuzeigen. Der DWM kann auf den Anwendungspuffern skizzen und diese an den Bildschirm senden, anstatt eine vollständige Kopie in ihren eigenen Swapchains auszuführen.
  • DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING können sogar in einem Fenster auf Systemen mit Mehrebenenüberlagerungsunterstützung eine noch geringere Latenz als das abwartbare Objekt ermöglichen.
  • Anwendungen haben die Kontrolle über die Inhaltsskalierung, die während der Fensteränderung erfolgt, mithilfe des DXGI_SCALING Eigenschaftssatzes während der Swapchainerstellung.
  • Inhalte in HDR-Formaten (R10G10B10A2_UNORM oder R16G16B16A16_FLOAT) werden nicht eingeklemmt, es sei denn, sie wird auf einem SDR-Desktop verfasst.
  • Aktuelle Statistiken sind im Fenstermodus verfügbar.
  • Es gibt eine größere Kompatibilität mit dem UWP-Anwendungsmodell (Universelle Windows-Plattform) und DX12, da diese nur mit dem Flip-Modell kompatibel sind.

Was muss ich tun, um das Flip-Modell zu verwenden?

Flip-Modell-Swapchains haben einige zusätzliche Anforderungen an blt Swapchains:

  1. Die Pufferanzahl muss mindestens 2 sein.
  2. Nachdem Present Aufrufe ausgeführt wurde, muss der Hintergrundpuffer explizit an den D3D11-Unmittelbarkontext gebunden werden, bevor er erneut verwendet werden kann.
  3. Nach dem Aufrufen SetFullscreenState-muss die Anwendung ResizeBuffers aufrufen, bevor Present.
  4. MSAA-Swapchains (Multisample Antialiasing) werden im Flip-Modell nicht direkt unterstützt. Daher muss die Anwendung eine MSAA-Auflösung ausführen, bevor sie die Presentausgibt.

Auswählen der richtigen Rendering- und Präsentationsauflösungen

Das herkömmliche Muster für Anwendungen in der Vergangenheit bestand darin, dem Benutzer eine Liste mit Auflösungen bereitzustellen, die ausgewählt werden sollen, wenn der Benutzer den exklusiven Vollbildmodus auswählt. Wenn moderne Displays nahtlos mit der Skalierung von Inhalten beginnen können, sollten Sie Benutzern die Möglichkeit bieten, eine Renderingauflösung für die Leistungsskalierung auszuwählen, unabhängig von einer Ausgabeauflösung und sogar im Fenstermodus. Darüber hinaus sollten Anwendungen IDXGIOutput6::CheckHardwareCompositionSupport nutzen, um festzustellen, ob sie die Inhalte vor der Präsentation skalieren müssen oder ob die Hardware die Skalierung für sie ausführen soll.

Möglicherweise müssen Ihre Inhalte im Rahmen des aktuellen oder Kompositionsvorgangs von einer GPU zu einer anderen migriert werden. Dies gilt häufig für Multi-GPU-Laptops oder Systeme mit angeschlossenen externen GPUs. Da diese Konfigurationen häufiger werden, und wenn hochauflösende Displays häufiger werden, erhöht sich die Kosten für die Darstellung einer vollständigen Auflösungs-Swapchain. Wenn das Ziel Ihrer Swapchain nicht der primäre Punkt der Benutzerinteraktion ist, wie es bei VR-Titeln der Fall ist, die eine 2D-Vorschau der VR-Szene in einem sekundären Fenster darstellen, sollten Sie eine niedrigere Auflösungs-Swapchain verwenden, um die Bandbreite zu minimieren, die über verschiedene GPUs übertragen werden muss.

Weitere Überlegungen

Wenn Sie die GPU zum ersten Mal auffordern, in den Swapchain-Hintergrundpuffer zu schreiben, ist die Zeit, zu der die GPU wartet, bis der Puffer verfügbar ist. Wenn möglich, verzögern Sie diesen Punkt so weit wie möglich in den Frame.