Verwenden Sie das DXGI-Flipmodell, um eine optimale Leistung zu erzielen.

Dieses Thema enthält Anleitungen für Entwickler zum Maximieren der Leistung und Effizienz im Präsentationsstapel unter modernen Windows-Versionen. Sie greift dort auf, wo DXGI flip model, DirectX 12: Presentation Modes In Windows 10 (Video) und Presentation Enhancements in Windows 10: An Early Look (Video) aufgehört haben.

Handlungsaufforderung

Wenn Sie weiterhin DXGI_SWAP_EFFECT_DISCARD oder DXGI_SWAP_EFFECT_SEQUENTIAL (auch das "blt"-Modell verwenden), ist es Zeit, aufzuhören!

Der Wechsel zu DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_DISCARD (auch das Flip-Modell) führt zu einer besseren Leistung, einem geringeren Energieverbrauch und einer umfangreicheren Reihe von Features. (Weitere Informationen zu diesen Werten finden Sie unter DXGI_SWAP_EFFECT Enumeration .)

Flip-Modell-Präsentierten gehen so weit, dass fensterbasierter Modus im Vergleich zum klassischen Vollbild-Exklusivmodus effektiv gleichwertig oder besser ist. In der Tat sollten Sie überlegen, ob Ihre Anwendung tatsächlich einen exklusiven Vollbildmodus benötigt, da die Vorteile eines rahmenlosen Fensters ein schnelleres Alt-Tab Wechseln und eine bessere Integration in moderne Anzeigefunktionen umfassen.

Warum jetzt? Vor dem Update vom April 2018 konnte blt-Modell-Präsentationen zu sichtbaren Rissen führen, wenn sie in Hybrid-GPU-Konfigurationen verwendet werden, die häufig in High-End-Laptops zu finden sind (siehe KB-3158621). Im Update vom April 2018 wurde dieses Tearing auf Kosten zusätzlicher Arbeit behoben. Wenn Sie blt-Darstellungen mit hohen Frameraten für Hybrid-GPUs ausführen, insbesondere bei hohen Auflösungen wie 4K, kann sich dieser zusätzliche Aufwand auf die Gesamtleistung auswirken. Um die beste Leistung auf diesen Systemen zu gewährleisten, wechseln Sie vom Blt zum Flip Present-Modell. Erwägen Sie darüber hinaus, die Auflösung Ihrer Swapchain zu reduzieren, insbesondere, wenn dies nicht der primäre Punkt der Benutzerinteraktion ist (wie dies häufig bei VR-Vorschaufenstern der Fall ist).

Ein kurzer Verlauf

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

Vor Windows 7 bestand die einzige Möglichkeit zum Präsentieren von Inhalten aus D3D darin, sie zu "blt" oder in eine Oberfläche zu kopieren, die sich im Besitz des Fensters oder Bildschirms befand. Beginnend mit dem FLIPEX-Tauscheffekt von D3D9 und der Einführung zu DXGI über den FLIP_SEQUENTIAL Tauscheffekt in Windows 8 haben wir eine effizientere Möglichkeit entwickelt, Inhalte auf den Bildschirm zu bringen, indem wir sie direkt mit dem Desktopkompositor mit minimalen Kopien freigeben. Eine allgemeine Übersicht über die Technologie finden Sie unter DXGI-Flip-Modell .

Diese Optimierung ist dank des DWM (Desktop Window Manager) möglich, dem Compositor, der den Windows-Desktop antreibt.

Wann sollte ich das blt-Modell verwenden?

Es gibt eine Funktion, die das Flip-Modell nicht bietet: die Möglichkeit, mehrere unterschiedliche APIs zu haben, die Inhalte produzieren, die alle in demselben HWND zusammengefasst sind, und zwar auf einer Gegenwartsbasis. Ein Beispiel hierfür wäre die Verwendung von D3D zum Zeichnen eines Fensterhintergrunds und dann Windows GDI , um etwas oben zu zeichnen, oder die Verwendung von zwei verschiedenen Grafik-APIs oder zwei Swapchains aus derselben API, um abwechselnde Frames zu erzeugen. Wenn Sie keine Interop auf HWND-Ebene zwischen Grafikkomponenten benötigen, benötigen Sie kein blt-Modell.

Es gibt eine zweite Funktion, die nicht im ursprünglichen Flip-Modell-Design bereitgestellt wurde, aber jetzt verfügbar ist, was die Möglichkeit ist, mit einer ungedrosselten Framerate zu präsentieren. Für eine Anwendung, die Synchronisierungsintervall 0 verwendet, wird der Wechsel zum Flip-Modell nicht empfohlen, es sei denn, die IDXGIFactory5::CheckFeatureSupport-API ist verfügbar und meldet Unterstützung für DXGI_FEATURE_PRESENT_ALLOW_TEARING. Dieses Feature ist in aktuellen Versionen von Windows 10 und auf moderner Hardware nahezu allgegenwärtig.

DirectFlip

Wenn Sie DirectX 12: Präsentationsmodi in Windows 10 gesehen haben, wird die Rede von "Direct Flip" und "Independent Flip" angezeigt. Dies sind Optimierungen, die für Anwendungen aktiviert sind, die Flip-Modell-Swapchains verwenden. Abhängig von der Fenster- und Pufferkonfiguration ist es möglich, die Desktopkomposition vollständig und direkt auf den Bildschirm zu senden, auf die gleiche Weise wie der exklusive Vollbildmodus.

Heutzutage können diese Optimierungen in einem von drei Szenarien in der Reihenfolge der Erhöhung der Funktionalität erfolgen:

  1. DirectFlip: Ihre Swapchainpuffer entsprechen den Bildschirmdimensionen, und Ihre Fensterclientregion deckt den Bildschirm ab. Anstatt die DWM-Swapchain zur Anzeige auf dem Bildschirm zu verwenden, wird die Swapchain der Anwendung verwendet.
  2. DirectFlip mit Panel-Fittern: Ihr Fensterclientbereich deckt den Bildschirm ab, und Ihre Swapchainpuffer liegen innerhalb eines hardwareabhängigen Skalierungsfaktors (z. B. 0,25x bis 4x) des Bildschirms. Die GPU-Scanouthardware wird verwendet, um Ihren Puffer zu skalieren und ihn an den Bildschirm zu senden.
  3. DirectFlip mit Mehrebenenüberlagerung (MPO): Ihre Swapchainpuffer befinden sich innerhalb eines hardwareabhängigen Skalierungsfaktors Ihrer Fensterdimensionen. Der DWM kann eine dedizierte Hardware-Abtastebene für Ihre Anwendung reservieren, die dann gescannt und möglicherweise in einen alpha-gemischten Unterbereich des Bildschirms gestreckt wird.

Mit dem fensterbasierten Flip-Modell kann die Anwendung die Hardwareunterstützung für verschiedene DirectFlip-Szenarien abfragen und verschiedene Arten der dynamischen Skalierung über die Verwendung von IDXGIOutput6::CheckHardwareCompositionSupport implementieren. Eine Einschränkung, die Sie beachten sollten, ist, dass es möglich ist, dass der Cursor dehnungsseitige Nebenwirkungen hat, wenn Panel-Monteure verwendet werden, was über DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED angezeigt wird.

Sobald Ihre Swapchain "DirectFlipped" lautet, kann die DWM in den Ruhemodus wechseln und nur dann wieder aufwachen, wenn sich etwas außerhalb Ihrer Anwendung ändert. Ihre Anwendungsframes werden unabhängig voneinander direkt an den Bildschirm gesendet, mit der gleichen Effizienz wie vollbildlich exklusiv. Dies ist "Independent Flip" und kann in allen oben genannten Szenarien verwendet werden. Wenn andere Desktopinhalte oben stehen, kann der DWM entweder nahtlos zurück in den zusammengesetzten Modus wechseln, den Inhalt auf der Anwendung effizient "umkehren", bevor er sie umdreht, oder MPO nutzen, um den unabhängigen Flip-Modus beizubehalten.

Sehen Sie sich das PresentMon-Tool an, um einen Einblick zu erhalten, welches der oben genannten Verwendet wurde.

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 Funktionen für Flip-Modellanwendungen zur Verwendung:

  • Verringern der Latenz durch DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. Im Unabhängigen Flip-Modus können Sie unter neueren Versionen von Windows auf einen Latenzrahmen von 1 herunterfahren, wobei ein ordnungsgemäßer Fallback bei der Komponie möglichst gering ist.
    • Vorbehalt: Es gab ein Problem, das mindestens zwei Frames der Latenz im Windows 10 Anniversary Update und früher ergab. Weitere Informationen finden Sie in diesem Forumthema . Dies wurde im Update des Fall Creator behoben.
  • DXGI_SWAP_EFFECT_FLIP_DISCARD ermöglicht einen Modus für die umgekehrte Komposition des direkten Spiegelns, was zu weniger Gesamtarbeit für die Anzeige des Desktops führt. Der DWM kann die Anwendungspuffer kritzeln und diese an den Bildschirm senden, anstatt eine vollständige Kopie in ihre eigenen Swapchains durchzuführen.
  • DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING kann sogar in einem Fenster auf Systemen mit Mehrebenen-Overlayunterstützung eine noch geringere Latenz als das wartebare Objekt ermöglichen.
  • Anwendungen haben die Kontrolle über die Inhaltsskalierung, die während der Fenstergröße erfolgt, indem sie die DXGI_SCALING Eigenschaft verwenden, die während der Swapchainerstellung festgelegt ist.
  • Inhalte in HDR-Formaten (R10G10B10A2_UNORM oder R16G16B16A16_FLOAT) werden nicht geklemmt, es sei denn, sie werden auf einem SDR-Desktop zusammengesetzt.
  • Aktuelle Statistiken sind im Fenstermodus verfügbar.
  • Die Kompatibilität mit dem UWP-Anwendungsmodell (Universelle Windows-Plattform) und DX12 ist höher, da diese nur mit dem Flip-Modell kompatibel sind.

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

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

  1. Die Pufferanzahl muss mindestens 2 sein.
  2. Nach Present-Aufrufen muss der Backpuffer explizit erneut an den D3D11-Direktkontext gebunden werden, bevor er wieder verwendet werden kann.
  3. Nach dem Aufruf von SetFullscreenState muss die Anwendung ResizeBuffers before Present aufrufen.
  4. MSAA-Swapchains (Multisample-Antialiasing) werden im Flip-Modell nicht direkt unterstützt, sodass die Anwendung eine MSAA-Auflösung durchführen muss, bevor sie das Geschenk ausgibt.

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

Das herkömmliche Muster für Anwendungen bestand in der Vergangenheit darin, dem Benutzer eine Liste von Auflösungen zur Auswahl zu stellen, wenn der Benutzer den exklusiven Vollbildmodus auswählt. Da 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 unabhängig von einer Ausgabeauflösung und sogar im Fenstermodus auszuwählen. Darüber hinaus sollten Anwendungen IDXGIOutput6::CheckHardwareCompositionSupport nutzen, um zu bestimmen, ob sie den Inhalt vor der Präsentation skalieren müssen oder ob sie die Hardware die Skalierung für sie durchführen lassen sollten.

Möglicherweise müssen Ihre Inhalte im Rahmen des vorliegenden Vorgangs oder des Kompositionsvorgangs von einer GPU zu einer anderen migriert werden. Dies gilt häufig für Laptops mit mehreren GPU-Geräten oder Für Systeme mit angeschlossenen externen GPUs. Wenn diese Konfigurationen häufiger auftreten und hochauflösende Displays immer häufiger auftreten, steigen die Kosten für die Darstellung einer Swapchain mit voller Auflösung. Wenn das Ziel Ihrer Swapchain nicht der primäre Punkt der Benutzerinteraktion ist, wie es häufig bei VR-Titeln der Fall ist, die eine 2D-Vorschau der VR-Szene in einem sekundären Fenster darstellen, sollten Sie eine Swapchain mit niedrigerer Auflösung verwenden, um die Bandbreite zu minimieren, die über verschiedene GPUs übertragen werden muss.

Weitere Überlegungen

Das erste Mal, wenn Sie die GPU zum Schreiben in den Swapchainbackpuffer auffordern, ist die Zeit, in der die GPU auf die Verfügbarkeit des Puffers wartet. Verzögern Sie diesen Punkt nach Möglichkeit so weit wie möglich in den Frame.