Compartir a través de


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 visualización que se está enviando actualmente a la pantalla. Este parámetro es realmente el identificador present 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 aumenta una vez cada intervalo de vblank.

SyncRefreshCount

Tipo: UINT

Recuento de vblank cuando el programador muestreó por última vez la hora de la máquina llamando 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.

Comentarios

Cuando una aplicación 9Ex adopta el modo flip presente (D3DSWAPEFFECT_FLIPEX), las aplicaciones pueden detectar la eliminación de fotogramas mediante una llamada a GetPresentStatistics en cualquier momento dado. 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 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. Si el ejemplo presentRefreshCount por última vez no coincide con PresentCount (es decir, si presentRefreshCount se ha incrementado, pero PresentCount no lo ha, entonces se ha quitado el fotograma).

Las aplicaciones pueden determinar si se ha quitado un fotograma mediante el muestreo de dos instancias de PresentCount y GetPresentStats (llamando a getPresentStats API en dos puntos en el tiempo). Por ejemplo, una aplicación multimedia que se presenta a la misma velocidad que la frecuencia 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 de los identificadores actuales (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 getPresentStats, el último fotograma presentado debe ser el marco C. Dado que la aplicación presenta un intervalo muy vblank (la frecuencia de actualización del monitor), el tiempo transcurrido entre el fotograma A se presenta y cuándo 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 han quitado fotogramas. 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 en modo FLIPEX.

Windows Vista: Las llamadas presentes se ponerá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 sincronizarla con 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 desde PresentRefreshCount que el siguiente fotograma ya está en tiempo de espera
  3. Establezca Intervalo actual en D3DPRESENT_FORCEIMMEDIATE
  4. Llamar a Present en el siguiente marco

Las aplicaciones pueden sincronizar secuencias de vídeo y audio 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 las aplicaciones ventanadas y a las 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 flip 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 la falta de recursos del sistema, puede experimentar un error de gráficos. Un problema es un problema visual llamado hipotético. 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. Se representa en el búfer de reserva.
  2. Llame a Present.
  3. Llame a GetPresentStats y almacene la estructura D3DPRESENTSTATS resultante.
  4. Represente el siguiente marco 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