Estructura D3DPRESENTSTATS

Describe las estadísticas de la cadena de intercambio relacionadas con las llamadas PresentEx .

Sintaxis

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

Miembros

PresentCount

Tipo: UINT

Número de llamadas Present correctas realizadas por un dispositivo de pantalla que se está enviando actualmente a la pantalla. Este parámetro es realmente el identificador presente de la última llamada Present y no es necesariamente el número total de llamadas API presentes realizadas.

PresentRefreshCount

Tipo: UINT

El recuento de vblank en el que se mostró el último presente en la pantalla, el recuento de vblank se incrementa una vez cada intervalo de vblank.

SyncRefreshCount

Tipo: UINT

El recuento de vblank cuando el programador muestreó por última vez la hora de la máquina mediante una llamada a QueryPerformanceCounter.

SyncQPCTime

Tipo: LARGE_INTEGER

La última hora de la máquina muestreada del programador, obtenida mediante una llamada a QueryPerformanceCounter.

SyncGPUTime

Tipo: LARGE_INTEGER

Este valor no se utiliza.

Observaciones

Cuando una aplicación 9Ex adopta el modo de volteo presente (D3DSWAPEFFECT_FLIPEX), las aplicaciones pueden detectar la eliminación de fotogramas llamando a GetPresentStatistics en cualquier momento. En efecto, pueden hacer lo siguiente.

  1. Representación en el búfer de reserva
  2. Llamar presente
  3. Llame a GetPresentStats y almacene la estructura D3DPRESENTSTATS resultante.
  4. Representar el siguiente marco en el búfer de reserva
  5. Llamar presente
  6. Repita los pasos 4 y 5 una o varias veces.
  7. Llame a GetPresentStats y almacene la estructura D3DPRESENTSTATS resultante.
  8. Compare los valores de PresentRefreshCount de las dos estructuras D3DPRESENTSTATS almacenadas. La aplicación puede calcular el elemento PresentRefreshCount correspondiente de un parámetro PresentCount determinado en función de las suposiciones del incremento PresentRefreshCount y la asignación presentCount de los fotogramas presentes. Si el ejemplo de PresentRefreshCount no coincide con presentCount (es decir, si presentRefreshCount se ha incrementado pero PresentCount no lo ha, entonces hubo la eliminación de fotogramas).

Las aplicaciones pueden determinar si un fotograma se ha quitado mediante el muestreo de dos instancias de PresentCount y GetPresentStats (llamando a la API GetPresentStats en dos puntos en el tiempo). Por ejemplo, una aplicación multimedia que se presenta a la misma velocidad que la velocidad de actualización del monitor (por ejemplo, la frecuencia de actualización del monitor es de 60Hz, la aplicación presenta un fotograma cada 1/60 segundos) quiere presentar fotogramas A, B, C, D, E, cada uno correspondiente a los identificadores presentes (PresentCount) 1, 2, 3, 7, 8.

El código de la aplicación es similar a la siguiente secuencia.

  1. Representación del marco A en el búfer de reserva
  2. Call Present, PresentCount = 1
  3. Llame a GetPresentStats y almacene la estructura D3DPRESENTSTATS resultante.
  4. Representar los siguientes 4 fotogramas, B, C, D, E, respectivamente
  5. Llamar a Present 4 veces, PresentCounts = 2, 3, 7, 8, respectivamente
  6. Llame a GetPresentStats y almacene la estructura D3DPRESENTSTATS resultante.
  7. Compare los valores de PresentRefreshCount de las dos estructuras D3DPRESENTSTATS almacenadas. Si la diferencia es 2, es decir, 2 intervalos de vblank ha transcurrido entre las dos llamadas API de GetPresentStats, el último fotograma presentado debe ser el fotograma C. Dado que la aplicación presenta un intervalo muy vblank (la frecuencia de actualización del monitor), el tiempo transcurrido entre cuando se presenta el fotograma A y cuando se presenta el fotograma C debe ser 2 vblanks.
  8. Compare los valores de PresentCount de las dos estructuras D3DPRESENTSTATS almacenadas. Si el primer PresentCount es 1 (correspondiente al marco A) y el segundo PresentCount es 3 (correspondiente al marco C), no se ha quitado ningún fotograma. Si el segundo PresentCount es 3, que corresponde al marco D, la aplicación sabe que se ha quitado un fotograma.

Tenga en cuenta que GetPresentStatistics se procesará después de llamar a , independientemente del estado de las llamadas a PresentEx del modo FLIPEX.

Windows Vista: las llamadas presentes se presentarán en cola y, a continuación, se procesarán antes de que se procese la llamada a GetPresentStats.

Cuando una aplicación detecta que la presentación de determinados fotogramas está detrás, puede omitir esos fotogramas y corregir la presentación para volver a sincronizar con la vblank. Para ello, una aplicación simplemente no puede representar los fotogramas en tiempo de espera e iniciar la representación con el siguiente fotograma correcto en la cola. Sin embargo, si una aplicación ya ha iniciado la representación de fotogramas en tiempo de expiración, puede usar un nuevo parámetro Present en D3D9Ex denominado D3DPRESENT_FORCEIMMEDIATE. La marca se pasará en los parámetros de la llamada API present e indica al tiempo de ejecución que el fotograma se procesará inmediatamente dentro del siguiente intervalo de vblank, de forma eficaz, no visible en la pantalla. Este es el ejemplo de uso de la aplicación después del último paso del ejemplo anterior.

  1. Representar el siguiente marco en el búfer de reserva
  2. Descubra en PresentRefreshCount que el siguiente fotograma ya está en tiempo de espera
  3. Establezca Intervalo presente en D3DPRESENT_FORCEIMMEDIATE
  4. Llamar a Present en el siguiente marco

Las aplicaciones pueden sincronizar secuencias de audio y vídeo de la misma manera porque el comportamiento de GetPresentStatistics no cambia en ese escenario.

El modo de volteo D3D9Ex proporciona información de estadísticas de fotogramas a aplicaciones ventanadas y aplicaciones 9Ex de pantalla completa.

Windows Vista: use las API de DWM para recuperar las estadísticas actuales.

Cuando el Administrador de ventanas de escritorio está desactivado, las aplicaciones en modo de ventana 9Ex que usan el modo de volteo recibirán información de estadísticas de precisión limitada.

**Windows Vista: **

Si una aplicación no es lo suficientemente rápida como para mantenerse al día con la frecuencia de actualización del monitor, posiblemente debido a la lentitud del hardware o a la falta de recursos del sistema, puede experimentar un problema de gráficos. Un problema es un llamado hipo visual. Si se establece un monitor para actualizar a 60 Hz y la aplicación solo puede administrar 30 fps, la mitad de los fotogramas tendrá problemas.

Las aplicaciones pueden detectar un error realizando un seguimiento de SynchRefreshCount. Por ejemplo, una aplicación podría realizar la siguiente secuencia de acciones.

  1. Representar en el búfer de reserva.
  2. Llame a Present.
  3. Llame a GetPresentStats y almacene la estructura D3DPRESENTSTATS resultante.
  4. Represente el siguiente fotograma en el búfer de reserva.
  5. Llame a Present.
  6. Llame a GetPresentStats y almacene la estructura D3DPRESENTSTATS resultante.
  7. Compare los valores de SyncRefreshCount de las dos estructuras D3DPRESENTSTATS almacenadas. Si la diferencia es mayor que una, se omitió un marco.

Requisitos

Requisito Value
Encabezado
D3d9types.h

Consulte también

Estructuras de Direct3D