Estrutura D3DPRESENTSTATS

Descreve estatísticas de swapchain relacionadas a chamadas PresentEx .

Sintaxe

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

Membros

PresentCount

Tipo: UINT

Contagem de chamadas Presentes bem-sucedidas feitas por um dispositivo de exibição que está sendo gerado para a tela no momento. Esse parâmetro é realmente a ID Presente da última chamada Presente e não é necessariamente o número total de chamadas à API Presente feitas.

PresentRefreshCount

Tipo: UINT

A contagem vblank na qual o último Presente foi exibido na tela, a contagem vblank incrementa uma vez a cada intervalo vblank.

SyncRefreshCount

Tipo: UINT

A contagem vblank quando o agendador amostra a hora do computador pela última vez chamando QueryPerformanceCounter.

SyncQPCTime

Tipo: LARGE_INTEGER

O último tempo de computador amostrado do agendador, obtido chamando QueryPerformanceCounter.

SyncGPUTime

Tipo: LARGE_INTEGER

Este valor não é usado.

Comentários

Quando um aplicativo 9Ex adota o Modo Flip presente (D3DSWAPEFFECT_FLIPEX), os aplicativos podem detectar a remoção de quadros chamando GetPresentStatistics a qualquer momento. Na verdade, eles podem fazer o seguinte.

  1. Renderizar para o buffer traseiro
  2. Chamar Presente
  3. Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante
  4. Renderizar o próximo quadro para o buffer traseiro
  5. Chamar Presente
  6. Repita as etapas 4 e 5 uma ou mais vezes
  7. Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante
  8. Compare os valores de PresentRefreshCount das duas estruturas D3DPRESENTSTATS armazenadas. O aplicativo pode calcular o PresentRefreshCount correspondente de um parâmetro PresentCount específico com base nas suposições de incremento PresentRefreshCount e atribuição PresentCount de presentes de quadro. Se a última amostra de PresentRefreshCount não corresponder ao PresentCount (ou seja, se o PresentRefreshCount tiver incrementado, mas PresentCount não tiver, haverá a remoção de quadros).)

Os aplicativos podem determinar se um quadro foi descartado por amostragem de duas instâncias de PresentCount e GetPresentStats (chamando a API GetPresentStats em dois pontos no tempo). Por exemplo, um aplicativo de mídia que está apresentando na mesma taxa que a taxa de atualização do monitor (por exemplo, monitorar a taxa de atualização é de 60Hz, o aplicativo apresenta um quadro a cada 1/60 segundos) deseja apresentar quadros A, B, C, D, E, cada um correspondente a IDs Presentes (PresentCount) 1, 2, 3, 7, 8.

O código do aplicativo se parece com a sequência a seguir.

  1. Renderizar o quadro A no buffer traseiro
  2. Call Present, PresentCount = 1
  3. Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante
  4. Renderize os próximos 4 quadros, B, C, D, E, respectivamente
  5. Chamada Presente 4 vezes, PresentCounts = 2, 3, 7, 8, respectivamente
  6. Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante
  7. Compare os valores de PresentRefreshCount das duas estruturas D3DPRESENTSTATS armazenadas. Se a diferença for 2, ou seja, 2 intervalos vblank decorridos entre as duas chamadas à API GetPresentStats, o último quadro apresentado deverá ser o quadro C. Como o aplicativo apresenta um intervalo muito vblank (a taxa de atualização do monitor), o tempo decorrido entre quando o quadro A é apresentado e quando o quadro C é apresentado deve ser de 2 vblanks.
  8. Compare os valores de PresentCount das duas estruturas D3DPRESENTSTATS armazenadas. Se o primeiro PresentCount for 1 (correspondente ao quadro A) e o segundo PresentCount for 3 (correspondente ao quadro C), nenhum quadro será removido. Se o segundo PresentCount for 3, que corresponde ao quadro D, o aplicativo saberá que um quadro foi removido.

Observe que GetPresentStatistics será processado depois de ser chamado, independentemente do estado das chamadas PresentEx do modo FLIPEX.

Windows Vista: As chamadas Presentes serão enfileiradas e processadas antes que a chamada getPresentStats seja processada.

Quando um aplicativo detecta que a apresentação de determinados quadros estão atrasados, ele pode ignorar esses quadros e corrigir a apresentação para sincronizar novamente com o vblank. Para fazer isso, um aplicativo simplesmente não pode renderizar os quadros atrasados e começar a renderizar com o próximo quadro correto na fila. No entanto, se um aplicativo já tiver iniciado a renderização de quadros atrasados, ele poderá usar um novo parâmetro Present em D3D9Ex chamado D3DPRESENT_FORCEIMMEDIATE. O sinalizador será passado nos parâmetros da chamada à API Presente e indica para o runtime que o quadro será processado imediatamente no próximo intervalo vblank, efetivamente não visível na tela. Aqui está o exemplo de uso do aplicativo após a última etapa no exemplo anterior.

  1. Renderizar o próximo quadro para o buffer traseiro
  2. Descubra em PresentRefreshCount que o próximo quadro já está atrasado
  3. Definir Intervalo de presente como D3DPRESENT_FORCEIMMEDIATE
  4. Chamar Presente no próximo quadro

Os aplicativos podem sincronizar fluxos de áudio e vídeo da mesma maneira porque o comportamento de GetPresentStatistics não muda nesse cenário.

O Modo flip D3D9Ex fornece informações de estatísticas de quadro para aplicativos em janelas e aplicativos 9Ex de tela inteira.

Windows Vista: Use as APIs dwm para recuperar as estatísticas atuais.

Quando o Gerenciador de Janelas da Área de Trabalho estiver desativado, os aplicativos 9Ex no modo de janela usando o modo de inversão receberão informações de estatísticas atuais de precisão limitada.

Windows Vista:

Se um aplicativo não for rápido o suficiente para acompanhar a taxa de atualização do monitor, possivelmente devido ao hardware lento ou à falta de recursos do sistema, ele poderá sofrer uma falha gráfica. Uma falha é o chamado soluço visual. Se um monitor estiver definido para ser atualizado a 60 Hz e o aplicativo puder gerenciar apenas 30 fps, metade dos quadros terá falhas.

Os aplicativos podem detectar uma falha mantendo o controle de SynchRefreshCount. Por exemplo, um aplicativo pode executar a seguinte sequência de ações.

  1. Renderize para o buffer de fundo.
  2. Chamar Presente.
  3. Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante.
  4. Renderize o próximo quadro para o buffer traseiro.
  5. Chamar Presente.
  6. Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante.
  7. Compare os valores de SyncRefreshCount das duas estruturas D3DPRESENTSTATS armazenadas. Se a diferença for maior que uma, um quadro foi ignorado.

Requisitos

Requisito Valor
parâmetro
D3d9types.h

Confira também

Estruturas Direct3D