Freigeben über


DXGI Flip-Modell

Windows 8 bietet Unterstützung für das Flip-Präsentationsmodell und die zugehörigen vorhandenen Statistiken in DXGI 1.2. Das DXGI-Flip-Präsentationsmodell von Windows 8 ähnelt dem Direct3D 9EX Flip Mode Presentationvon Windows 7. Video- oder Bildfrequenz-basierte Präsentations-Apps wie Spiele können am meisten profitieren, indem Sie das Flip-Präsentationsmodell verwenden. Apps, die das DXGI Flip-Präsentationsmodell verwenden, reduzieren die Systemressourcenlast und erhöhen die Leistung. Apps können auch verbesserungen an Statistiken mit Flip-Präsentationsmodell verwenden, um die Darstellungsrate besser zu steuern, indem Sie Feedback- und Korrekturmechanismen in Echtzeit bereitstellen.

Vergleich des DXGI-Flipmodells und des BitBlt-Modells

Die Laufzeit verwendet die Bitblockübertragung (Bitblt) und Flip-Präsentationsmodelle, um Grafikinhalte auf Anzeigemonitoren darzustellen. Der größte Unterschied zwischen Bitblt- und Flip-Präsentationsmodellen besteht darin, wie Hintergrundpufferinhalte zum Windows 8 DWM für die Komposition gelangen. Im Bitblt-Modell werden die Inhalte des Hintergrundpuffers in die Umleitungsoberfläche auf jedem Aufruf von IDXGISwapChain1::P resent1kopiert. Im Flip-Modell werden alle Hintergrundpuffer für den Desktopfenster-Manager (DWM) freigegeben. Daher kann der DWM direkt aus diesen Hintergrundpuffern ohne zusätzliche Kopiervorgänge verfassen. Im Allgemeinen ist das Flip-Modell effizienter. Das Flip-Modell bietet auch weitere Features, z. B. erweiterte aktuelle Statistiken.

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

Leistungsverbesserungen des DXGI-Flipmodells sind wichtig, 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 flip-Modell im Vergleich zum Bitblt-Modell auswählen.

Schritt BitBlt-Modell, das für DWM vorhanden ist DXGI-Flip-Modell, das dwM präsentiert
1. Die App aktualisiert ihren Frame (Write)
Die App aktualisiert ihren Frame (Write)
2. Direct3D-Laufzeit kopiert Oberflächeninhalte auf eine DWM-Umleitungsoberfläche (Lese-, Schreib-)
Direct3D-Laufzeit übergibt die App-Oberfläche an DWM
3. Nach Abschluss der Kopie der freigegebenen Oberfläche rendert DWM die App-Oberfläche auf dem Bildschirm (Lese-, Schreibzugriff)
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 Systemspeicherauslastung, indem die Anzahl der Lese- und Schreibvorgänge durch die Direct3D-Laufzeit für die Fensterframekomposition durch DWM reduziert wird.

Verwenden des DXGI-Flipmodells

Direct3D 11.1-Apps für Windows 8 verwenden Flip-Modell, indem die Swapchain mit dem im SwapEffect Member der DXGI_SWAP_CHAIN_DESC1 Struktur festgelegten DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL Enumerationswerts erstellt wird. Wenn Sie SwapEffect- auf DXGI_SWAP_EFFECT_FLIP_SEQUENTIALfestlegen, legen Sie diese Elemente von DXGI_SWAP_CHAIN_DESC1 auch auf die angegebenen Werte fest:

  • BufferCount zu einem Wert zwischen 2 und 16, um eine Leistungsstrafe zu verhindern, da auf DWM gewartet wird, um den vorherigen Präsentationspuffer freizugeben.
  • Formatieren DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM oder DXGI_FORMAT_R8G8B8A8_UNORM
  • Count Member der DXGI_SAMPLE_DESC-Struktur, die das SampleDesc Member angibt, und das Quality Member von DXGI_SAMPLE_DESC auf Null, da mehrere Beispiel-Antialiasing (MSAA) nicht unterstützt werden

Wenn Sie DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL unter Windows 7 oder einem früheren Betriebssystem verwenden, schlägt die Geräteerstellung fehl. Wenn Sie das Flip-Modell verwenden, können Sie statistiken im Vollbildmodus verwenden. Das Vollbildverhalten ist nicht betroffen. Wenn Sie NULL- an den pFullscreenDesc Parameter IDXGIFactory2::CreateSwapChainForHwnd für eine Fenster-Swapchain übergeben und SwapEffect- auf DXGI_SWAP_EFFECT_FLIP_SEQUENTIALfestlegen, erstellt die Laufzeit einen zusätzlichen Hintergrundpuffer und dreht den Puffer, der zum Frontpuffer zur Präsentationszeit wird.

Berücksichtigen Sie beim Verwenden des Flip-Modells die folgenden Tipps:

  • Verwenden Sie eine Flip-Modell-Swapchain pro HWND-. Verwenden Sie nicht mehrere Flip-Modell-Swapchains auf dieselbe HWND-.
  • Verwenden Sie keine Flipmodell-Swapchain mit der ScrollWindow- oder ScrollWindowEx--Funktion von GDI. Einige Direct3D-Apps verwenden die ScrollWindow- und ScrollWindowEx--Funktionen, um Fensterinhalte zu aktualisieren, nachdem ein Benutzerlaufereignis eintritt. ScrollWindow und ScrollWindowEx Bitblts von Fensterinhalten auf dem Bildschirm ausführen, während der Benutzer ein Fenster scrollt. Diese Funktionen erfordern auch Bitblt-Modellupdates für GDI- und Direct3D-Inhalte. Apps, die eine der beiden Funktionen verwenden, zeigen nicht unbedingt sichtbare Fensterinhalte auf dem Bildschirm an, wenn sich die App im Fenstermodus befindet. Es wird empfohlen, dass Sie die ScrollWindow- und ScrollWindowEx--Funktionen nicht verwenden und stattdessen GDI- und Direct3D-Inhalte als Reaktion auf das Scrollen auf dem Bildschirm neu zeichnen.
  • Verwenden Sie das Flip-Modell in einer HWND-, die nicht auch von anderen APIs, einschließlich DXGI-Bitblt-Präsentationsmodell, anderen Versionen von Direct3D oder GDI, ausgerichtet ist. Da das Bitblt-Modell eine zusätzliche Kopie der Oberfläche verwaltet, können Sie GDI und andere Direct3D-Inhalte demselben HWND- durch Stückaktualisierungen 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 Laufzeit ignoriert alle anderen Bitblt-Modell-Direct3D- oder GDI-Inhaltsupdates.

Framesynchronisierung von DXGI Flip-Modell-Apps

Aktuelle Statistiken sind Frame-Timing-Informationen, mit denen Medien-Apps Video- und Audiodatenströme synchronisieren und von Videowiedergabestörungen wiederherstellen. Apps können die Frame-Timing-Informationen in den vorliegenden Statistiken verwenden, um die Darstellungsrate ihrer Videoframes für eine reibungslosere Präsentation anzupassen. Rufen Sie zum Abrufen vorhandener Statistiken 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 stellt Statistiken sowohl im Fenstermodus als auch im Vollbildmodus bereit. Bei Bitblt-Modell-Swapchains im Fenstermodus sind alle DXGI_FRAME_STATISTICS Werte Nullen.

Bei Flip-Modell werden Statistiken IDXGISwapChain::GetFrameStatistics in folgenden Situationen DXGI_ERROR_FRAME_STATISTICS_DISJOINT zurückgegeben:

  • Erster Aufruf von GetFrameStatistics, der den Anfang einer Sequenz angibt
  • Modusänderung: Entweder Fenstermodus zu Oder von Vollbild- oder Vollbildmodus zu Vollbildübergängen

Die Werte in PresentRefreshCount, SyncRefreshCountund SyncQPCTime Member von DXGI_FRAME_STATISTICS weisen die folgenden Merkmale auf:

  • PresentRefreshCount- entspricht SyncRefreshCount-, wenn die App auf allen vsync angezeigt wird.
  • SyncRefreshCount- wird im vsync-Intervall abgerufen, wenn das Aktuelle übermittelt wurde, SyncQPCTime- ungefähr die Zeit ist, die dem vsync-Intervall zugeordnet ist.

Die IDXGISwapChain::GetLastPresentCount Methode gibt die letzte aktuelle Anzahl zurück, d. h. die aktuelle ID der letzten erfolgreichen IDXGISwapChain1::P resent1 Aufruf eines Anzeigegeräts, das der Swapchain zugeordnet ist. Diese aktuelle ID ist der Wert des PresentCount Member der DXGI_FRAME_STATISTICS Struktur. Bei Bitblt-Modell-Swapchains im Fenstermodus sind 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. Warteschlange IDXGISwapChain1::P resent1 Aufrufe (d. a. IDXGISwapChain1::P resent1 mehrmals aufrufen, was dazu führt, dass sie in einer Warteschlange erfasst werden).

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

  3. So erkennen Sie einen Glitch:

    • Rufen Sie IDXGISwapChain::GetFrameStatisticsauf.
    • Rufen Sie für diesen Frame die aktuelle ID (PresentCount) und die vsync-Anzahl ab, in der das Betriebssystem das letzte Bild auf dem Monitor angezeigt hat (PresentRefreshCount).
    • Rufen Sie die erwartete PresentRefreshCount- ab, die der aktuellen ID zugeordnet ist und die Sie zuvor in der Present-Warteschlangenstruktur gespeichert haben.
    • Wenn die tatsächliche PresentRefreshCount- später als die erwartete PresentRefreshCount-ist, ist ein Glitch aufgetreten.
  4. So stellen Sie den Glitch wieder her:

    • Berechnen Sie die Anzahl der Frames, um die aus dem Glitch wiederhergestellt werden soll. Wenn z. B. Schritt 3 anzeigt, dass die erwartete vsync-Anzahl (PresentRefreshCount) für eine aktuelle ID (PresentCount) 5 ist und die tatsächliche vsync-Anzahl für die aktuelle ID 8 ist, ist die Anzahl der Frames, die zum Wiederherstellen aus dem Glitch übersprungen werden sollen, 3 Frames.

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

      Anmerkung

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

       

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

Abbildung eines Beispielszenarios zum Wiederherstellen von Störungen in der Framepräsentation

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

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

Abbildung einer Zeitzeile von Präsentationsereignissen

Die Abbildung veranschaulicht diese Sequenz:

  1. Die App wird auf vsync aktiviert, wird blau gerendert, ruft IDXGISwapChain1::P resent1auf und geht dann in den Ruhezustand zurück.

  2. Die Grafikverarbeitungseinheit (GPU) wird aus dem Leerlauf aktiviert, führt das Rendern in Blau aus und geht dann in den Ruhezustand zurück.

  3. Der DWM wird beim nächsten vsync aufwacht, erstellt blau in seinen Hintergrundpuffer, ruft IDXGISwapChain1::P resent1auf und geht dann zurück in den Ruhezustand.

  4. Die App wird aktiviert, grün gerendert, ruft IDXGISwapChain1::P resent1auf und geht dann in den Ruhezustand zurück.

    Anmerkung

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

     

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

  6. Schließlich zeigt der digitale zu analoge Konverter (DAC) Ergebnisse der DWM-Komposition auf dem Monitor auf dem nächsten vsync.

Ab der Zeitlinie können Sie sich die Latenz der vorhandenen Statistiken vorstellen und wie Störungen auftreten können. Um z. B. eine DWM-Glitch für die grüne Farbe anzuzeigen, die auf dem Bildschirm angezeigt wird, stellen Sie sich vor, das grüne/rote Feld zu verbreitern, damit die rechte Seite des grün/roten Felds bis zur rechten Seite des lila/roten Felds übereinstimmt. In diesem Szenario zeigt der DAC zwei Blaue Frames und dann den grünen Rahmen an. Sie können sehen, dass dieser Glitch aus dem Lesen vorhandener Statistiken aufgetreten ist.

Verbessern der Präsentation mit dem Flip-Modell, schmutzigen Rechtecke und Bildlaufbereichen