Struttura D3DPRESENTSTATS

Descrive le statistiche di swapchain relative alle chiamate PresentEx .

Sintassi

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

Members

PresentCount

Tipo: UINT

Numero di chiamate presenti riuscite effettuate da un dispositivo visualizzato che attualmente restituisce lo schermo. Questo parametro è in realtà l'ID presente dell'ultima chiamata Presente e non è necessariamente il numero totale di chiamate API presenti effettuate.

PresentRefreshCount

Tipo: UINT

Conteggio vblank in corrispondenza del quale è stato visualizzato l'ultimo presente sullo schermo, il conteggio vblank aumenta una volta ogni intervallo vblank.

SyncRefreshCount

Tipo: UINT

Il conteggio vblank quando l'utilità di pianificazione ha eseguito l'ultimo esempio dell'ora del computer chiamando QueryPerformanceCounter.

SyncQPCTime

Tipo: LARGE_INTEGER

L'ultimo tempo di computer di esempio dell'utilità di pianificazione ottenuto chiamando QueryPerformanceCounter.

SyncGPUTime

Tipo: LARGE_INTEGER

Questo valore non viene utilizzato.

Commenti

Quando un'applicazione 9Ex adotta la modalità Flip (D3DSWAPEFFECT_FLIPEX), le applicazioni possono rilevare l'eliminazione dei fotogrammi chiamando GetPresentStatistics in qualsiasi momento. In effetti, possono eseguire le operazioni seguenti.

  1. Eseguire il rendering nel buffer back
  2. Chiama presente
  3. Chiamare GetPresentStats e archiviare la struttura D3DPRESENTSTATS risultante
  4. Eseguire il rendering del frame successivo nel buffer indietro
  5. Chiama presente
  6. Ripetere i passaggi 4 e 5 volte
  7. Chiamare GetPresentStats e archiviare la struttura D3DPRESENTSTATS risultante
  8. Confrontare i valori di PresentRefreshCount dalle due strutture D3DPRESENTSTATS archiviate. L'applicazione può calcolare il corrispondente PresentRefreshCount di un determinato parametro PresentCount in base ai presupposti dell'incremento di PresentRefreshCount e dell'assegnazione PresentCount dei frame. Se l'ultimo sampled PresentRefreshCount non corrisponde a PresentCount,ad esempio se PresentRefreshCount è stato incrementato, ma PresentCount non ha, è stato eliminato il frame.

Le applicazioni possono determinare se un frame è stato eliminato eseguendo il campionamento di due istanze di PresentCount e GetPresentStats (chiamando l'API GetPresentStats in qualsiasi due punti di tempo). Ad esempio, un'applicazione multimediale che presenta allo stesso tasso di aggiornamento del monitoraggio (ad esempio, la frequenza di aggiornamento del monitoraggio è 60Hz, l'applicazione presenta un frame ogni 1/60 secondi) vuole presentare fotogrammi A, B, C, D, E, ognuno corrispondente a ID presenti (PresentCount) 1, 2, 3, 7, 8.

Il codice dell'applicazione è simile alla sequenza seguente.

  1. Eseguire il rendering del frame A nel buffer indietro
  2. Call Present, PresentCount = 1
  3. Chiamare GetPresentStats e archiviare la struttura D3DPRESENTSTATS risultante
  4. Eseguire rispettivamente il rendering dei 4 fotogrammi, B, C, D, E
  5. Chiama presente 4 volte, PresentCounts = 2, 3, 7, 8, rispettivamente
  6. Chiamare GetPresentStats e archiviare la struttura D3DPRESENTSTATS risultante
  7. Confrontare i valori di PresentRefreshCount dalle due strutture D3DPRESENTSTATS archiviate. Se la differenza è 2, ovvero 2 intervalli vblank trascorsi tra le due chiamate API GetPresentStats, l'ultimo frame presentato deve essere frame C. Poiché l'applicazione presenta una volta l'intervallo vblank (frequenza di aggiornamento del monitoraggio), il tempo trascorso tra quando viene presentato frame A e quando viene presentato frame C deve essere 2 vblanks.
  8. Confrontare i valori di PresentCount dalle due strutture D3DPRESENTSTATS archiviate. Se il primo PresentCount è 1 (corrispondente al frame A) e il secondo PresentCount è 3 (corrispondente al frame C), non sono stati eliminati fotogrammi. Se il secondo PresentCount è 3, che corrisponde al frame D, l'applicazione sa che un frame è stato eliminato.

Si noti che GetPresentStatistics verrà elaborato dopo che viene chiamato, indipendentemente dallo stato delle chiamate PresentEx in modalità FLIPEX.

Windows Vista: Le chiamate presenti verranno accodate e quindi elaborate prima che venga elaborata la chiamata GetPresentStats.

Quando un'applicazione rileva che la presentazione di determinati frame è dietro, può ignorare tali fotogrammi e correggere la presentazione per sincronizzare nuovamente con vblank. A tale scopo, un'applicazione non può semplicemente eseguire il rendering dei frame tardi e iniziare a eseguire il rendering con il frame corretto successivo nella coda. Tuttavia, se un'applicazione ha già avviato il rendering di frame tardive, può usare un nuovo parametro Present in D3D9Ex denominato D3DPRESENT_FORCEIMMEDIATE. Il flag verrà passato nei parametri della chiamata API Presente e indica al runtime che il frame verrà elaborato immediatamente all'interno dell'intervallo vblank successivo, in modo efficace non visibile sullo schermo. Ecco l'esempio di utilizzo dell'applicazione dopo l'ultimo passaggio nell'esempio precedente.

  1. Eseguire il rendering del frame successivo nel buffer indietro
  2. Individuare da PresentRefreshCount che il frame successivo è già in ritardo
  3. Impostare l'intervallo Presente su D3DPRESENT_FORCEIMMEDIATE
  4. Chiamare Presente nel frame successivo

Le applicazioni possono sincronizzare i flussi video e audio nello stesso modo perché il comportamento di GetPresentStatistics non cambia in questo scenario.

La modalità flip D3D9Ex fornisce informazioni sulle statistiche frame per le applicazioni finestrate e le applicazioni a schermo intero 9Ex.

Windows Vista: Usare le API DWM per recuperare le statistiche presenti.

Quando Desktop Window Manager è disattivato, le applicazioni in modalità 9Ex finestra che usano la modalità flip riceveranno le informazioni sulle statistiche di accuratezza limitata.

Windows Vista:

Se un'applicazione non è abbastanza veloce per mantenere la frequenza di aggiornamento del monitoraggio, probabilmente a causa di hardware lento o mancanza di risorse di sistema, può riscontrare un problema grafico. Un glitch è un cosiddetto hiccup visivo. Se un monitor è impostato per aggiornare a 60 Hz e l'applicazione può gestire solo 30 fps, la metà dei fotogrammi avrà problemi.

Le applicazioni possono rilevare un problema tenendo traccia di SynchRefreshCount. Ad esempio, un'applicazione potrebbe eseguire la sequenza di azioni seguente.

  1. Eseguire il rendering nel buffer indietro.
  2. Chiama presente.
  3. Chiamare GetPresentStats e archiviare la struttura D3DPRESENTSTATS risultante.
  4. Eseguire il rendering del frame successivo nel buffer indietro.
  5. Chiama presente.
  6. Chiamare GetPresentStats e archiviare la struttura D3DPRESENTSTATS risultante.
  7. Confrontare i valori di SyncRefreshCount dalle due strutture D3DPRESENTSTATS archiviate. Se la differenza è maggiore di una, è stata ignorata una cornice.

Requisiti

Requisito Valore
Intestazione
D3d9types.h

Vedi anche

Strutture Direct3D