Medição de latência e PresentMon
Nesta página
PCBenchmarkX mede separadamente a latência interna de processamento e a latência de apresentação do frame. Estas métricas de software não descrevem todo o caminho desde o clique do rato até ao acendimento do pixel no ecrã. O ciclo completo de medição está descrito na metodologia.
Estímulo de software próprio
Seção intitulada “Estímulo de software próprio”Um fluxo constante gera sinais com intervalos determinísticos de 8-12 ms. Se o Windows o permitir, cria um temporizador de espera de alta precisão; caso contrário, utiliza um temporizador de espera normal. A espera do evento dispensa a sondagem contínua, que ocuparia o kernel. A resolução global do temporizador do sistema não é alterada.
Para cada sinal são registados o prazo planeado, o despertar do gerador, o sinal efetivo, o despertar do recetor, a simulação, o envio de comandos, os timestamps da GPU e os eventos de apresentação. Um identificador comum de frame liga todas as etapas.
Prazo planeado → despertar do gerador → sinal ↓ despertar do recetor ↓ CPU → comandos → GPU ↓ Present → evento de apresentaçãoNestas cadeias veem-se separadamente tanto o atraso do temporizador como a latência do despertar do recetor. O início da Core Latency é o sinal efetivo, por isso o passo do prazo planeado até ao sinal não é contabilizado nesta métrica.
Decomposição por etapas do caminho de latência
Seção intitulada “Decomposição por etapas do caminho de latência”O resultado contém uma decomposição por etapas do caminho medido latency_path — separadamente para Baseline e Loaded. As etapas são contabilizadas a partir do sinal efetivo:
| Etapa | O que mede |
|---|---|
signal_to_consumer_wake |
do sinal até ao despertar do recetor |
cpu_processing |
o processamento na CPU: simulação e preparação dos dados do frame |
cpu_end_to_submit_start |
a pausa desde o fim do trabalho da CPU até ao início da preparação do envio |
workload_submit_cpu_span |
a preparação e o registo dos comandos da API gráfica |
submit_start_to_gpu_begin |
desde o início da preparação até ao início do trabalho da GPU; isto não é a latência pura da fila |
gpu_execution |
a própria execução do trabalho da GPU, em ciclos da GPU |
| presentation spans | a apresentação: o wrapper Present e os intervalos desde o sinal e desde o fim do trabalho da GPU até ScreenTime |
Cada etapa é apresentada como uma distribuição com estatísticas e percentis. Os segmentos são calculados para cada par de marcas separadamente, e não por subtração de duas medianas. Se a marca final de uma etapa estiver ausente ou não for fiável, a sua distribuição permanece vazia — não há valores substitutos. O atraso do temporizador (a divergência entre o prazo planeado e o sinal efetivo) é registado como um diagnóstico separado antes do sinal e não entra nos valores totais do caminho.
QPC e timestamps próprios da GPU
Seção intitulada “QPC e timestamps próprios da GPU”O tempo da CPU é registado através de QueryPerformanceCounter. Para a GPU, o motor coloca duas timestamp query em torno do trabalho medido, obtém a frequência da fila através de GetTimestampFrequency e converte a diferença de ticks em milissegundos:
GPU work, ms = (GPU_end − GPU_begin) × 1000 / GPU_frequencySegundo a documentação da Microsoft sobre D3D12 timing, timestamp query reflete a passagem do trabalho até ao fim do pipeline, e os contadores da GPU e da CPU são correlacionados através de GetClockCalibration.
O par de calibração GPU/QPC permite expressar a conclusão do trabalho da GPU na mesma escala temporal que o sinal:
GPU_completion_QPC = calibration_QPC + (GPU_end − calibration_GPU) × QPC_frequency / GPU_frequency
Core Latency, ms = (GPU_completion_QPC − signal_QPC) × 1000 / QPC_frequencyA precisão desta estimativa depende em grande medida de quão exatamente estão correlacionados os relógios da CPU e da GPU. De qualquer forma, não cobre o caminho USB do rato, o tempo de varrimento da matriz nem a resposta do pixel. A Microsoft descreve separadamente os detalhes das marcas QPC de alta precisão.
Baseline e Loaded
Seção intitulada “Baseline e Loaded”O Baseline mede a latência na configuração mínima desta carga. O Loaded funciona com uma carga de GPU calibrada em 8,333333 ms, ou seja, num orçamento computacional de aproximadamente 120 Hz. O monitor físico pode ter outra frequência.
A calibração altera a complexidade dentro do shader no intervalo de 1-4096. O número de passagens mantém-se fixo: quatro pós-passagens. Primeiro é selecionado um intervalo em torno do tempo alvo, depois este é refinado e a configuração escolhida é verificada. Para ocupar o mesmo tempo numa placa gráfica rápida, é necessário um trabalho mais complexo.
Nos testes de desempenho, o volume de trabalho é fixo. No Loaded Latency, a carga é calibrada para que o tempo de trabalho da GPU seja semelhante em placas gráficas diferentes. As marcas temporais obtidas não são normalizadas após a medição.
A apresentação dos frames do teste de latência passa por um caminho de apresentação separado: janela sem moldura em modo flip-discard, latência máxima de frame (maximum frame latency) 1, objeto DXGI de espera e tearing, se o sistema o suportar. Este caminho está separado da carga fixa de desempenho, que é executada fora do buffer de ecrã e não provoca Present.
O papel do PresentMon
Seção intitulada “O papel do PresentMon”Para os eventos de apresentação é utilizada a biblioteca PresentMon 2.5.1. É um projeto ETW de análise de eventos gráficos no Windows, descrito pelos seus autores. O Procmon / Process Monitor não é utilizado neste pipeline de medição.
O PCBenchmarkX inicia a sua própria sessão de recolha, seleciona os eventos do seu processo e associa os frames aos sinais de software. Para isso não é necessária uma serviço separada nem o arranque manual de um PresentMon separado.
São guardados intervalos adicionais:
- do sinal até
Present; - de
PresentatéScreenTime; - do sinal até
ScreenTime.
ScreenTime é um evento de software de apresentação do frame; não é utilizado um fotodíodo para medir a luz do ecrã. No modelo base CPU/GPU/Latency, os pesos de Baseline e Loaded são 20/80 dentro do componente de latência. As métricas de apresentação não entram no PC Score; o que entra nele está descrito no cálculo das pontuações. O arranque de uma sessão ETW pode exigir a execução como administrador ou a pertença ao grupo «Utilizadores de Registo de Desempenho». Se não for possível iniciar a sessão, o bloco deste diagnóstico não existirá, e a falha é registada explicitamente no resultado. A ausência de dados não é igual a latência zero.
O tempo de GPU do PresentMon também é guardado separadamente do tempo próprio de D3D12. Os programadores do PresentMon assinalam limitações de precisão das métricas de GPU com HAGS. Por isso, o motor não substitui os timestamps próprios da GPU pela estimativa do ETW.
O que foi desenvolvido no PCBenchmarkX
Seção intitulada “O que foi desenvolvido no PCBenchmarkX”No PCBenchmarkX foram desenvolvidos o gerador de sinais, a associação das etapas do frame, a simulação na CPU, as cargas de D3D12, a calibração do Loaded, a ordem dos blocos repetidos, a recolha de medições, o tratamento estatístico e o modelo de pontuações. O QPC e o D3D12 são fornecidos pelo Windows. Para a recolha de eventos gráficos através de ETW é utilizado o projeto aberto PresentMon.
A descrição da medição foi atualizada em 2026-10-02 para o motor 0.8.0. A documentação da Microsoft sobre QPC e D3D12 foi novamente verificada nesta data. A referência ao PresentMon diz respeito à versão utilizada 2.5.1.
