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.
- Renderizar para o buffer traseiro
- Chamar Presente
- Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante
- Renderizar o próximo quadro para o buffer traseiro
- Chamar Presente
- Repita as etapas 4 e 5 uma ou mais vezes
- Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante
- 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.
- Renderizar o quadro A no buffer traseiro
- Call Present, PresentCount = 1
- Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante
- Renderize os próximos 4 quadros, B, C, D, E, respectivamente
- Chamada Presente 4 vezes, PresentCounts = 2, 3, 7, 8, respectivamente
- Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante
- 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.
- 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.
- Renderizar o próximo quadro para o buffer traseiro
- Descubra em PresentRefreshCount que o próximo quadro já está atrasado
- Definir Intervalo de presente como D3DPRESENT_FORCEIMMEDIATE
- 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.
- Renderize para o buffer de fundo.
- Chamar Presente.
- Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante.
- Renderize o próximo quadro para o buffer traseiro.
- Chamar Presente.
- Chame GetPresentStats e armazene a estrutura D3DPRESENTSTATS resultante.
- 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 |
|
Confira também