DXGI-Flipmodell

Windows 8 fügt Unterstützung für das Flip-Präsentationsmodell und die zugehörigen aktuellen Statistiken in DXGI 1.2 hinzu. Windows 8 das DXGI-Flip-Präsentationsmodell ähnelt der Direct3D 9EX Flip Mode-Präsentation von Windows 7. Video- oder Bildfrequenzbasierte Präsentations-Apps wie Spiele können von der Verwendung des Flip-Präsentationsmodells am meisten profitieren. Apps, die das DXGI-Flip-Präsentationsmodell verwenden, reduzieren die Auslastung der Systemressourcen und erhöhen die Leistung. Apps können auch Verbesserungen für aktuelle Statistiken mit dem Flip-Präsentationsmodell verwenden, um die Darstellungsrate besser zu steuern, indem sie Echtzeitfeedback und Korrekturmechanismen bereitstellen.

Vergleich des DXGI-Flipmodells und des BitBlt-Modells

Die Runtime verwendet die Bitblockübertragung (Bitblt) und die Flip-Präsentationsmodelle, um Grafikinhalte auf Anzeigemonitoren darzustellen. Der größte Unterschied zwischen Bitblt- und Flip-Präsentationsmodellen besteht darin, wie Backpufferinhalte zum Windows 8 DWM für die Komposition gelangen. Im Bitblt-Modell wird der Inhalt des Rückpuffers bei jedem Aufruf von IDXGISwapChain1::P resent1 in die Umleitungsoberfläche kopiert. Im Flip-Modell werden alle Backpuffer mit dem Desktopfenster-Manager (DWM) gemeinsam genutzt. Daher kann der DWM direkt aus diesen Backpuffern ohne zusätzliche Kopiervorgänge erstellen. Im Allgemeinen ist das Flip-Modell effizienter. Das Flip-Modell bietet auch weitere Features, z. B. erweiterte Gegenwartsstatistiken.

Wenn Sie über Ältere Komponenten verfügen, die windows Graphics Device Interface (GDI) verwenden, um direkt in einen HWND zu schreiben, verwenden Sie das Bitblt-Modell.

Leistungsverbesserungen des DXGI-Flipmodells sind erheblich, wenn sich die App im Fenstermodus befindet. Die Sequenz in dieser Tabelle und die Abbildung vergleichen speicherbandbreitennutzungen und Systemlese- und Schreibvorgänge von Fenster-Apps, die das Flip-Modell und das Bitblt-Modell auswählen.

Schritt BitBlt-Modell, das in DWM vorhanden ist DXGI-Flipmodell für DWM
1. Die App aktualisiert ihren Frame (Schreiben)
Die App aktualisiert ihren Frame (Schreiben)
2. Direct3D Runtime kopiert Oberflächeninhalte auf eine DWM-Umleitungsoberfläche (Lesen, Schreiben)
Direct3D Runtime übergibt die App-Oberfläche an DWM
3. Nachdem das Kopieren der freigegebenen Oberfläche abgeschlossen ist, rendert DWM die App-Oberfläche auf dem Bildschirm (Lesen, Schreiben).
DWM rendert die App-Oberfläche auf dem Bildschirm (Lesen, Schreiben)

 

Abbildung eines Vergleichs des blt-Modells und des Flip-Modells

Das Flip-Modell reduziert die Arbeitsspeicherauslastung des Systems, indem die Anzahl von Lese- und Schreibvorgängen durch die Direct3D-Runtime für die Fensterrahmenkomposition durch DWM reduziert wird.

Verwenden des DXGI-Flipmodells

Direct3D 11.1-Apps, die auf Windows 8 abzielen, verwenden das Flip-Modell, indem sie die Swapchain mit dem DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL Enumerationswert erstellen, der im SwapEffect-Member der DXGI_SWAP_CHAIN_DESC1-Struktur festgelegt ist. Wenn Sie SwapEffect auf DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL festlegen, legen Sie auch diese Member von DXGI_SWAP_CHAIN_DESC1 auf die angegebenen Werte fest:

  • BufferCount auf einen Wert zwischen 2 und 16, um eine Leistungseinbuße aufgrund des Wartens auf DWM zum Freigeben des vorherigen Präsentationspuffers zu verhindern.
  • Formatieren in DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM oder DXGI_FORMAT_R8G8B8A8_UNORM
  • Zählen Sie Member der DXGI_SAMPLE_DESC Struktur, die das SampleDesc-Element auf eins und den Quality-Member von DXGI_SAMPLE_DESC auf Null angibt, da mehrere Stichproben-Antialiasing (MSAA) nicht unterstützt wird.

Wenn Sie DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL unter Windows 7 oder früheren Betriebssystemen verwenden, schlägt die Geräteerstellung fehl. Wenn Sie das Flip-Modell verwenden, können Sie statistiken im Vollbildmodus anzeigen im Fenstermodus verwenden. Das Vollbildverhalten ist nicht betroffen. Wenn Sie NULL an den pFullscreenDesc-Parameter von IDXGIFactory2::CreateSwapChainForHwnd für eine Fenster-Swapchain-Kette übergeben und SwapEffect auf DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL festlegen, erstellt die Runtime einen zusätzlichen Rückpuffer und rotiert, welches Handle zum Puffer gehört, der zur Präsentationszeit zum Frontpuffer wird.

Wenn Sie das Flip-Modell verwenden, sollten Sie die folgenden Tipps berücksichtigen:

  • Verwenden Sie eine Flip-Modell-Swapchain pro HWND. Richten Sie nicht mehrere Flip-Modell-Swapketten auf dieselbe HWND aus.
  • Verwenden Sie keine Flip-Modell-Swapchain mit der Funktion ScrollWindow oder ScrollWindowEx von GDI. Einige Direct3D-Apps verwenden die Funktionen ScrollWindow und ScrollWindowEx von GDI, um den Inhalt von Fenstern nach einem Benutzerlaufereignis zu aktualisieren. ScrollWindow und ScrollWindowEx führen Bitblts von Fensterinhalten auf dem Bildschirm aus, während der Benutzer ein Fenster scrollt. Diese Funktionen erfordern auch Bitblt-Modellupdates für GDI- und Direct3D-Inhalte. Apps, die beide Funktionen verwenden, zeigen nicht unbedingt sichtbare Fensterinhalte an, die auf dem Bildschirm scrollen, wenn sich die App im Fenstermodus befindet. Es wird empfohlen, dass Sie die Funktionen ScrollWindow und ScrollWindowEx von GDI nicht verwenden und stattdessen GDI- und Direct3D-Inhalte auf dem Bildschirm als Reaktion auf den Bildlauf neu zeichnen.
  • Verwenden Sie ein Flip-Modell in einem HWND , das nicht auch von anderen APIs, einschließlich DXGI-Bitblt-Präsentationsmodell, anderen Versionen von Direct3D oder GDI, verwendet wird. Da das Bitblt-Modell eine zusätzliche Kopie der Oberfläche beibehält, können Sie GDI und andere Direct3D-Inhalte demselben HWND durch stückweise Updates von Direct3D und GDI hinzufügen. Wenn Sie das Flip-Modell verwenden, sind nur Direct3D-Inhalte in Flip-Modell-Swapchains sichtbar, die die Laufzeit an DWM übergibt. Die Runtime ignoriert alle anderen Bitblt-Modell-Direct3D- oder GDI-Inhaltsupdates.

Framesynchronisierung von DXGI-Flip-Modell-Apps

Bei den vorliegenden Statistiken handelt es sich um Frame-Timing-Informationen, die Medien-Apps verwenden, um Video- und Audiostreams zu synchronisieren und nach Videowiedergabefehlern wiederherzustellen. Apps können die Frame-Timing-Informationen in aktuellen Statistiken verwenden, um die Darstellungsrate ihrer Videoframes für eine reibungslosere Darstellung anzupassen. Um aktuelle Statistikinformationen abzurufen, rufen Sie die IDXGISwapChain::GetFrameStatistics-Methode auf, um die DXGI_FRAME_STATISTICS-Struktur abzurufen. DXGI_FRAME_STATISTICS enthält Statistiken zu IDXGISwapChain1::P resent1-Aufrufen . Eine Flip-Modell-Swapchain bietet aktuelle Statistikinformationen sowohl im Fenstermodus als auch im Vollbildmodus. Bei Bitblt-Modell-Swapketten im Fenstermodus sind alle DXGI_FRAME_STATISTICS Werte Nullen.

IdXGISwapChain::GetFrameStatistics gibt in folgenden Situationen DXGI_ERROR_FRAME_STATISTICS_DISJOINT zurück:

  • Erster Aufruf von GetFrameStatistics, der den Beginn einer Sequenz angibt
  • Moduswechsel: Entweder Fenstermodus zu oder von Vollbild- oder Vollbildmodus zu Vollbildübergängen

Die Werte in PresentRefreshCount, SyncRefreshCount und SyncQPCTime-Member von DXGI_FRAME_STATISTICS weisen die folgenden Merkmale auf:

  • PresentRefreshCount ist gleich SyncRefreshCount , wenn die App auf jeder vsync-Instanz angezeigt wird.
  • SyncRefreshCount wird für das vsync-Intervall abgerufen, wenn die Gegenwart übermittelt wurde. SyncQPCTime entspricht ungefähr der Zeit, die dem vsync-Intervall zugeordnet ist.

Die IDXGISwapChain::GetLastPresentCount-Methode gibt die letzte aktuelle Anzahl zurück, d. h. die aktuelle ID des letzten erfolgreichen IDXGISwapChain1::P resent1-Aufrufs eines Anzeigegeräts, das der Swap chain zugeordnet ist. Diese vorliegende ID ist der Wert des PresentCount-Members der DXGI_FRAME_STATISTICS-Struktur . Bei Bitblt-Modell-Swapchains sind im Fenstermodus alle DXGI_FRAME_STATISTICS Werte Nullen.

Vermeiden, Erkennen und Wiederherstellen von Störungen

Führen Sie die folgenden Schritte aus, um Störungen in der Framepräsentation zu vermeiden, zu erkennen und wiederherzustellen:

  1. Warteschlangen-IDXGISwapChain1::P resent1-Aufrufe (das heißt, IDXGISwapChain1::P resent1 mehrmals aufrufen, wodurch sie in einer Warteschlange gesammelt werden).

  2. Erstellen Sie eine Present-Queue-Struktur, um alle erfolgreich übermittelten IDXGISwapChain1::P resent1-ID (zurückgegeben von IDXGISwapChain::GetLastPresentCount) und zugeordnete, berechnete/erwartete PresentRefreshCount-Werte zu speichern.

  3. So erkennen Sie einen Fehler:

    • Rufen Sie IDXGISwapChain::GetFrameStatistics auf.
    • Rufen Sie für diesen Frame die aktuelle ID (PresentCount) und die vsync-Anzahl ab, bei der das Betriebssystem dem Monitor das letzte Image (PresentRefreshCount) angezeigt hat.
    • Rufen Sie die erwartete PresentRefreshCount ab, die der aktuellen ID zugeordnet ist und die Sie zuvor in der struktur present-queue gespeichert haben.
    • Wenn der tatsächliche PresentRefreshCount höher als der erwartete PresentRefreshCount ist, ist ein Fehler aufgetreten.
  4. So stellen Sie die Wiederherstellung nach dem Fehler her:

    • Berechnen Sie die Anzahl der Frames, die zum Wiederherstellen des Fehlers übersprungen werden sollen. Wenn z. B. Schritt 3 zeigt, dass die erwartete vsync-Anzahl (PresentRefreshCount) für eine aktuelle ID (PresentCount) 5 und die tatsächliche vsync-Anzahl für die aktuelle ID 8 ist, beträgt die Anzahl der Frames, die zur Wiederherstellung von der Störung übersprungen werden sollen, 3 Frames.

    • Übergeben Sie 0 an den SyncInterval-Parameter in dieser Anzahl von Aufrufen von IDXGISwapChain1::P resent1 , um diese Anzahl von Frames zu verwerfen und zu überspringen.

      Hinweis

      Wenn der Glitch aus einer großen Anzahl von Frames besteht, rufen Sie IDXGISwapChain1::P resent1 auf, wobei der Flags-Parameter auf DXGI_PRESENT_RESTART festgelegt ist, um alle ausstehenden Geschenke in der Warteschlange zu verwerfen und zu überspringen.

       

Hier sehen Sie ein Beispielszenario für die Wiederherstellung von Störungen in der Framepräsentation:

Abbildung eines Beispielszenarios zur Wiederherstellung von Störungen in der Framepräsentation

Im Beispielszenario erwarten Sie, dass Frame A auf dem Bildschirm mit einer vsync-Anzahl von 1 angezeigt wird. Sie erkennen jedoch tatsächlich die vsync-Anzahl, die Frame A auf dem Bildschirm angezeigt wird, als 4. Daher stellen Sie fest, dass ein Fehler aufgetreten ist. Sie können dann 3 Frames verwerfen, d. h. Sie können 0 an den SyncInterval-Parameter in 3 Aufrufen von IDXGISwapChain1::P resent1 übergeben. Im vorherigen Beispielszenario benötigen Sie zum Wiederherstellen des Fehlers insgesamt 8 IDXGISwapChain1::P resent1-Aufrufe . Der 9. Frame wird dann gemäß der erwarteten vsync-Anzahl angezeigt.

Hier sehen Sie eine Zeitlinie mit Präsentationsereignissen. Jede vertikale Linie stellt eine vsync dar. Die horizontale Richtung ist die Zeit, die nach rechts zunimmt. Mithilfe der Abbildung können Sie sich vorstellen, wie Störungen auftreten können.

Abbildung einer Zeitlinie von Präsentationsereignissenl

Die Abbildung veranschaulicht diese Sequenz:

  1. Die App wird auf vsync aktiviert, wird blau gerendert, ruft IDXGISwapChain1::P resent1 auf und wechselt dann wieder in den Ruhemodus.

  2. Die Grafikverarbeitungseinheit (Graphics Processing Unit, GPU) wird aus dem Leerlauf aktiviert, führt das Rendern in Blau aus und wechselt dann wieder in den Ruhemodus.

  3. Der DWM wird bei der nächsten vsync aktiviert, setzt blau in den Backpuffer ein, ruft IDXGISwapChain1::P resent1 auf und wechselt dann wieder in den Ruhemodus.

  4. Die App wird aufgeweckt, grün gerendert, ruft IDXGISwapChain1::P resent1 auf und wechselt dann wieder in den Ruhemodus.

    Hinweis

    Die App wird gleichzeitig ausgeführt, während die GPU die Komposition von Blau ausführt.

     

  5. Als Nächstes wird die GPU grün für die App gerendert.

  6. Schließlich zeigt der Digital-Analog-Konverter (DAC) die Ergebnisse der DWM-Komposition auf dem Monitor auf der nächsten vsync an.

Von der Zeitlinie aus können Sie sich die Latenz der aktuellen Statistiken und die Auftreten von Störungen vorstellen. Um beispielsweise eine DWM-Störung für die grüne Farbe anzuzeigen, die auf dem Bildschirm angezeigt wird, stellen Sie sich vor, das grün/rote Feld zu erweitern, sodass die rechte Seite des grünen/roten Felds mit der rechten Seite des lila/roten Felds übereinstimmt. In diesem Szenario zeigt die DAC zwei blaue Frames und dann den grünen Rahmen an. Sie können sehen, dass dieser Fehler aufgetreten ist, wenn Sie die vorliegenden Statistiken lesen.

Verbessern der Präsentation mit dem Flip-Modell, modifiziert Rechtecke und scrollten Bereichen