Share via


D3DPRESENTSTATS-Struktur

Beschreibt Swapchainstatistiken in Bezug auf PresentEx-Aufrufe .

Syntax

typedef struct _D3DPRESENTSTATS {
  UINT          PresentCount;
  UINT          PresentRefreshCount;
  UINT          SyncRefreshCount;
  LARGE_INTEGER SyncQPCTime;
  LARGE_INTEGER SyncGPUTime;
} D3DPRESENTSTATS;

Member

PresentCount

Typ: UINT

Ausführen der Anzahl der erfolgreichen Präsentieren von Aufrufen, die von einem Anzeigegerät ausgeführt werden, das derzeit auf dem Bildschirm ausgegeben wird. Dieser Parameter ist wirklich die Present-ID des letzten Present-Aufrufs und entspricht nicht unbedingt der Gesamtzahl der ausgeführten Present-API-Aufrufe.

PresentRefreshCount

Typ: UINT

Die vblank-Anzahl, bei der das letzte Geschenk auf dem Bildschirm angezeigt wurde, die vblank-Anzahl erhöht sich einmal in jedem vblank-Intervall.

SyncRefreshCount

Typ: UINT

Die vblank-Anzahl, wenn der Planer die Computerzeit zuletzt durch Aufrufen von QueryPerformanceCounter erfasst hat.

SyncQPCTime

Typ: LARGE_INTEGER

Die letzte Computerzeit des Schedulers, die durch Aufrufen von QueryPerformanceCounter abgerufen wird.

SyncGPUTime

Typ: LARGE_INTEGER

Dieser Wert wird nicht verwendet.

Bemerkungen

Wenn eine 9Ex-Anwendung den Flip Mode present (D3DSWAPEFFECT_FLIPEX) verwendet, können Anwendungen das Löschen von Frames erkennen, indem Sie GetPresentStatistics jederzeit aufrufen. In der Tat können sie die folgenden Aktionen ausführen.

  1. Rendern in den Backpuffer
  2. Call Present
  3. Rufen Sie GetPresentStats auf, und speichern Sie die resultierende D3DPRESENTSTATS-Struktur.
  4. Rendern des nächsten Frames im Backpuffer
  5. Call Present
  6. Wiederholen Sie die Schritte 4 und 5 ein oder mehrmals
  7. Rufen Sie GetPresentStats auf, und speichern Sie die resultierende D3DPRESENTSTATS-Struktur.
  8. Vergleichen Sie die Werte von PresentRefreshCount aus den beiden gespeicherten D3DPRESENTSTATS-Strukturen. Die Anwendung kann den entsprechenden PresentRefreshCount eines bestimmten PresentCount-Parameters basierend auf den Annahmen von PresentRefreshCount-Inkrement und PresentCount-Zuweisung von Frame-Präsentationen berechnen. Wenn die letzte Stichprobe von PresentRefreshCount nicht mit dem PresentCount übereinstimmt (d. h. wenn der PresentRefreshCount erhöht wurde, PresentCount jedoch nicht, wurde der Frame gelöscht.)

Anwendungen können ermitteln, ob ein Frame gelöscht wurde, indem sie zwei beliebige Instanzen von PresentCount und GetPresentStats stichprobenieren (indem sie die GetPresentStats-API zu einem beliebigen Zeitpunkt aufrufen). Beispielsweise möchte eine Medienanwendung, die die gleiche Rate wie die Monitoraktualisierungsrate darstellt (z. B. die Monitoraktualisierungsrate beträgt 60 Hz, die Anwendung stellt alle 1/60 Sekunden einen Frame vor), die Frames A, B, C, D, E darstellen, die jeweils den Aktuellen IDs (PresentCount) 1, 2, 3, 7, 8 entsprechen.

Der Anwendungscode sieht wie die folgende Sequenz aus.

  1. Rendern von Frame A in den Backpuffer
  2. Call Present, PresentCount = 1
  3. Rufen Sie GetPresentStats auf, und speichern Sie die resultierende D3DPRESENTSTATS-Struktur.
  4. Rendern der nächsten 4 Frames( B, C, D, E)
  5. Call Present 4 mal, PresentCounts = 2, 3, 7, 8, bzw.
  6. Rufen Sie GetPresentStats auf, und speichern Sie die resultierende D3DPRESENTSTATS-Struktur.
  7. Vergleichen Sie die Werte von PresentRefreshCount aus den beiden gespeicherten D3DPRESENTSTATS-Strukturen. Wenn der Unterschied 2 ist, d. h. zwischen den beiden GetPresentStats-API-Aufrufen 2 vblank-Intervalle verstrichen sind, sollte der letzte angezeigte Frame Frame C sein. Da die Anwendung einmal ein sehr vblank-Intervall (die Aktualisierungsrate des Monitors) darstellt, sollte die Zeit zwischen der Darstellung von Frame A und der Darstellung von Frame C 2 vblanks betragen.
  8. Vergleichen Sie die Werte von PresentCount aus den beiden gespeicherten D3DPRESENTSTATS-Strukturen. Wenn der erste PresentCount 1 (entspricht Frame A) und der zweite PresentCount 3 ist (entspricht Frame C), wurden keine Frames gelöscht. Wenn der zweite PresentCount 3 ist, was Frame D entspricht, weiß die Anwendung, dass ein Frame gelöscht wurde.

Beachten Sie, dass GetPresentStatistics nach dem Aufruf verarbeitet wird, unabhängig vom Zustand der PresentEx-Aufrufe im FLIPEX-Modus.

Windows Vista: Die Present-Aufrufe werden in die Warteschlange gestellt und dann verarbeitet, bevor der GetPresentStats-Aufruf verarbeitet wird.

Wenn eine Anwendung erkennt, dass die Darstellung bestimmter Frames im Hintergrund ist, kann sie diese Frames überspringen und die Präsentation korrigieren, um sie erneut mit dem vblank zu synchronisieren. Dazu kann eine Anwendung die späten Frames einfach nicht rendern und das Rendern mit dem nächsten richtigen Frame in der Warteschlange beginnen. Wenn eine Anwendung jedoch bereits mit dem Rendern von späten Frames begonnen hat, kann sie einen neuen Present-Parameter in D3D9Ex mit dem Namen D3DPRESENT_FORCEIMMEDIATE verwenden. Das Flag wird in den Parametern des Aktuellen API-Aufrufs übergeben und gibt der Laufzeit an, dass der Frame sofort innerhalb des nächsten vblank-Intervalls verarbeitet wird, was auf dem Bildschirm überhaupt nicht sichtbar ist. Hier sehen Sie das Anwendungsnutzungsbeispiel nach dem letzten Schritt im vorherigen Beispiel.

  1. Rendern des nächsten Frames im Backpuffer
  2. Entdecken Sie in PresentRefreshCount, dass der nächste Frame bereits zu spät ist.
  3. Festlegen von Gegenwartsintervall auf D3DPRESENT_FORCEIMMEDIATE
  4. Aufrufen von "Present" für den nächsten Frame

Anwendungen können Video- und Audiodatenströme auf die gleiche Weise synchronisieren, da sich das Verhalten von GetPresentStatistics in diesem Szenario nicht ändert.

D3D9Ex Flip Mode bietet Framestatistikinformationen für Anwendungen mit Fenstern und Vollbild-9Ex-Anwendungen.

Windows Vista: Verwenden Sie die DWM-APIs zum Abrufen vorhandener Statistiken.

Wenn der Desktopfenster-Manager deaktiviert ist, erhalten 9Ex-Anwendungen im Fenstermodus, die den Flip-Modus verwenden, aktuelle Statistikinformationen mit eingeschränkter Genauigkeit.

Windows Vista:

Wenn eine Anwendung nicht schnell genug ist, um mit der Aktualisierungsrate des Monitors Schritt zu halten, möglicherweise aufgrund einer langsamen Hardware oder eines Mangels an Systemressourcen, kann es zu einem Grafikfehler führen. Ein Glitch ist ein sogenannter visueller Schluckauf. Wenn ein Monitor auf eine Aktualisierung von 60 Hz festgelegt ist und die Anwendung nur 30 fps verwalten kann, weist die Hälfte der Frames Störungen auf.

Anwendungen können einen Fehler erkennen, indem sie SynchRefreshCount nachverfolgen. Beispielsweise kann eine Anwendung die folgende Abfolge von Aktionen ausführen.

  1. Rendern sie in den Backpuffer.
  2. Rufen Sie "Present" auf.
  3. Rufen Sie GetPresentStats auf, und speichern Sie die resultierende D3DPRESENTSTATS-Struktur.
  4. Rendern Sie den nächsten Frame im Backpuffer.
  5. Rufen Sie "Present" auf.
  6. Rufen Sie GetPresentStats auf, und speichern Sie die resultierende D3DPRESENTSTATS-Struktur.
  7. Vergleichen Sie die Werte von SyncRefreshCount aus den beiden gespeicherten D3DPRESENTSTATS-Strukturen. Wenn der Unterschied größer als eins ist, wurde ein Frame übersprungen.

Anforderungen

Anforderung Wert
Header
D3d9types.h

Siehe auch

Direct3D-Strukturen