Structure D3DPRESENTSTATS

Décrit les statistiques de la chaîne d’échange relatives aux appels PresentEx .

Syntaxe

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

Membres

PresentCount

Type : UINT

Nombre d’appels de présentation réussis effectués par un périphérique d’affichage qui est en cours de mise à l’écran. Ce paramètre est en fait l’ID présent du dernier appel Present et n’est pas nécessairement le nombre total d’appels d’API Present effectués.

PresentRefreshCount

Type : UINT

Nombre vblank auquel le dernier présent a été affiché à l’écran, le nombre de vblanks s’incrémente une fois chaque intervalle vblank.

SyncRefreshCount

Type : UINT

Nombre de vblanks lorsque le planificateur a échantillonné l’heure de l’ordinateur pour la dernière fois en appelant QueryPerformanceCounter.

SyncQPCTime

Type : LARGE_INTEGER

Dernière heure de machine échantillonnées du planificateur, obtenue en appelant QueryPerformanceCounter.

SyncGPUTime

Type : LARGE_INTEGER

Cette valeur n'est pas utilisée.

Notes

Lorsqu’une application 9Ex adopte le mode flip présent (D3DSWAPEFFECT_FLIPEX), les applications peuvent détecter la suppression d’images en appelant GetPresentStatistics à tout moment. En fait, ils peuvent effectuer les opérations suivantes.

  1. Rendu dans la mémoire tampon d’arrière-mémoire
  2. Appel présent
  3. Appeler GetPresentStats et stocker la structure D3DPRESENTSTATS résultante
  4. Rendu de l’image suivante dans la mémoire tampon d’arrière-mémoire
  5. Appel présent
  6. Répéter les étapes 4 et 5 une ou plusieurs fois
  7. Appeler GetPresentStats et stocker la structure D3DPRESENTSTATS résultante
  8. Comparez les valeurs de PresentRefreshCount des deux structures D3DPRESENTSTATS stockées. L’application peut calculer le PresentRefreshCount correspondant d’un paramètre PresentCount particulier en fonction des hypothèses de l’incrément presentRefreshCount et de l’affectation PresentCount des images présentes. Si le Dernier PresentRefreshCount échantillonné ne correspond pas à PresentCount (c’est-à-dire si le PresentRefreshCount s’est incrémenté mais que PresentCount ne l’a pas fait, il y a eu suppression d’images.)

Les applications peuvent déterminer si une image a été supprimée en échantillonnant deux instances de PresentCount et GetPresentStats (en appelant l’API GetPresentStats à deux points dans le temps). Par exemple, une application multimédia qui présente à la même vitesse que la fréquence d’actualisation du moniteur (par exemple, la fréquence d’actualisation du moniteur est de 60 Hz, l’application présente une image toutes les 1/60 secondes) souhaite présenter les images A, B, C, D, E, chacune correspondant à Present IDs (PresentCount) 1, 2, 3, 7, 8.

Le code de l’application ressemble à la séquence suivante.

  1. Afficher le frame A dans la mémoire tampon d’arrière-mémoire
  2. Appeler Present, PresentCount = 1
  3. Appeler GetPresentStats et stocker la structure D3DPRESENTSTATS résultante
  4. Afficher les 4 images suivantes, B, C, D, E, respectivement
  5. Appeler Present 4 fois, PresentCounts = 2, 3, 7, 8, respectivement
  6. Appeler GetPresentStats et stocker la structure D3DPRESENTSTATS résultante
  7. Comparez les valeurs de PresentRefreshCount des deux structures D3DPRESENTSTATS stockées. Si la différence est de 2, c’est-à-dire que 2 intervalles vblank se sont écoulés entre les deux appels d’API GetPresentStats, le dernier frame présenté doit être frame C. Étant donné que l’application présente une fois l’intervalle très vblank (la fréquence d’actualisation du moniteur), le temps écoulé entre le moment où l’image A est présentée et le moment où l’image C est présentée doit être de 2 vblanks.
  8. Comparez les valeurs de PresentCount des deux structures D3DPRESENTSTATS stockées. Si le premier PresentCount est 1 (correspondant à l’image A) et le second PresentCount est 3 (correspondant à l’image C), aucune trame n’a été supprimée. Si le second PresentCount est 3, ce qui correspond à l’image D, l’application sait qu’une image a été supprimée.

Notez que GetPresentStatistics sera traité après son appel, quel que soit l’état des appels PresentEx en mode FLIPEX.

Windows Vista : Les appels Présents sont mis en file d’attente, puis traités avant que l’appel GetPresentStats ne soit traité.

Lorsqu’une application détecte que la présentation de certains cadres est en retard, elle peut ignorer ces images et corriger la présentation pour la resynchroniser avec le vblank. Pour ce faire, une application peut simplement ne pas restituer les images en retard et commencer le rendu avec le frame correct suivant dans la file d’attente. Toutefois, si une application a déjà démarré le rendu des images en retard, elle peut utiliser un nouveau paramètre Present dans D3D9Ex appelé D3DPRESENT_FORCEIMMEDIATE. L’indicateur est passé dans les paramètres de l’appel d’API Present et indique au runtime que le frame sera traité immédiatement dans l’intervalle vblank suivant, ce qui n’est pas du tout visible à l’écran. Voici l’exemple d’utilisation de l’application après la dernière étape de l’exemple précédent.

  1. Rendu de l’image suivante dans la mémoire tampon d’arrière-mémoire
  2. Découvrez à partir de PresentRefreshCount que l’image suivante est déjà en retard
  3. Définissez l’intervalle actuel sur D3DPRESENT_FORCEIMMEDIATE
  4. Appeler Present sur l’image suivante

Les applications peuvent synchroniser les flux vidéo et audio de la même manière, car le comportement de GetPresentStatistics ne change pas dans ce scénario.

Le mode flip D3D9Ex fournit des informations sur les statistiques de trame aux applications fenêtrés et aux applications 9Ex plein écran.

Windows Vista : Utilisez les API DWM pour récupérer les statistiques actuelles.

Lorsque le Gestionnaire de fenêtres du bureau est désactivé, les applications 9Ex en mode fenêtré utilisant le mode retournement reçoivent des informations statistiques présentes d’une précision limitée.

Windows Vista :

Si une application n’est pas assez rapide pour suivre la fréquence d’actualisation du moniteur, peut-être en raison d’un matériel lent ou d’un manque de ressources système, elle peut rencontrer un problème graphique. Un problème est ce que l’on appelle un hoquet visuel. Si un moniteur est configuré pour s’actualiser à 60 Hz et que l’application ne peut gérer que 30 images par seconde, la moitié des images présente des problèmes.

Les applications peuvent détecter un problème en effectuant le suivi de SynchRefreshCount. Par exemple, une application peut effectuer la séquence d’actions suivante.

  1. Rendu dans la mémoire tampon d’arrière-mémoire.
  2. Appelez Présent.
  3. Appelez GetPresentStats et stockez la structure D3DPRESENTSTATS résultante.
  4. Restituez l’image suivante dans la mémoire tampon d’arrière-mémoire.
  5. Appelez Présent.
  6. Appelez GetPresentStats et stockez la structure D3DPRESENTSTATS résultante.
  7. Comparez les valeurs de SyncRefreshCount des deux structures D3DPRESENTSTATS stockées. Si la différence est supérieure à un, un cadre a été ignoré.

Spécifications

Condition requise Valeur
En-tête
D3d9types.h

Voir aussi

Direct3D Structures