Přeskočit na obsah

Měření latencí a PresentMon

Na této stránce

PCBenchmarkX měří odděleně vnitřní latenci zpracování a latenci výstupu snímku. Tyto softwarové metriky nepopsují celou cestu od kliknutí myší až po rozsvícení pixelu na obrazovce. Celý měřicí cyklus je popsán v metodice.

Vlastní softwarový stimul

Sekce “Vlastní softwarový stimul”

Nepřetržitý proud generuje signály s deterministickými intervaly 8-12 ms. Pokud to Windows dovolí, vytvoří čekající časovač s vysokou přesností; jinak použije běžný čekající časovač. Čekání na událost se obejde bez nepřetržitého dotazování, které by zaměstnávalo jádro. Globální rozlišení systémového časovače se přitom nemění.

Pro každý signál se loguje plánovaný termín, probuzení generátoru, skutečný signál, probuzení příjemce, simulace, odeslání příkazů, časová razítka GPU a události zobrazení. Společný identifikátor snímku propojuje všechny etapy.

Plánovaný termín → probuzení generátoru → signál
↓
probuzení příjemce
↓
CPU → příkazy → GPU
↓
Present → událost výstupu

V těchto záznamech je odděleně vidět jak zpoždění časovače, tak latence probuzení příjemce. Začátek Core Latency je skutečný signál, proto se krok od plánovaného termínu k signálu v této metrice nepočítá.

Rozklad cesty latence po etapách

Sekce “Rozklad cesty latence po etapách”

Výsledek obsahuje rozklad měřené cesty latency_path po etapách — odděleně pro Baseline a Loaded. Etapy se počítají od skutečného signálu:

Etapa Co měří
signal_to_consumer_wake od signálu po probuzení příjemce
cpu_processing CPU zpracování: simulaci a přípravu dat snímku
cpu_end_to_submit_start pauzu od konce CPU práce do začátku přípravy odeslání
workload_submit_cpu_span přípravu a zápis příkazů grafického API
submit_start_to_gpu_begin od začátku přípravy do začátku GPU práce; nejde o čistou latenci fronty
gpu_execution samotné vykonání GPU práce, v taktech GPU
presentation spans zobrazení: obálku Present a intervaly od signálu a od konce GPU práce do ScreenTime

Každá etapa je dána rozdělením se statistikami a percentily. Segmenty se počítají pro každou dvojici značek zvlášť, nikoli odečtením dvou mediánů. Pokud koncová značka etapy chybí nebo je nedůvěryhodná, její rozdělení zůstane prázdné — žádné náhradní hodnoty neexistují. Zpoždění časovače (rozpor mezi plánovaným termínem a skutečným signálem) se zaznamenává jako samostatná diagnostika před signálem a do souhrnných hodnot cesty se nezahrnuje.

QPC a vlastní GPU timestamps

Sekce “QPC a vlastní GPU timestamps”

CPU čas se zaznamenává přes QueryPerformanceCounter. Pro GPU engine umisťuje dvě timestamp query kolem měřené práce, získává frekvenci fronty přes GetTimestampFrequency a převádí rozdíl tiků na milisekundy:

GPU work, ms = (GPU_end − GPU_begin) × 1000 / GPU_frequency

Podle dokumentace Microsoftu k D3D12 timing timestamp query odráží průchod práce do konce pipeline a GPU a CPU čítače se svazují přes GetClockCalibration.

Kalibrační pár GPU/QPC umožňuje vyjádřit dokončení GPU práce na stejné časové škále jako signál:

GPU_completion_QPC = calibration_QPC +
(GPU_end − calibration_GPU) × QPC_frequency / GPU_frequency
Core Latency, ms =
(GPU_completion_QPC − signal_QPC) × 1000 / QPC_frequency

Přesnost tohoto odhadu do značné míry závisí na tom, jak přesně jsou hodiny CPU a GPU přiřazeny. Stále nepokrývá USB cestu myši, dobu skenování matice ani odezvu pixelu. Microsoft samostatně popisuje nuance vysoce přesných značek QPC.

Baseline měří latenci v minimální konfiguraci této zátěže. Loaded pracuje s GPU zátěží kalibrovanou na 8,333333 ms, tedy na výpočetní rozpočet přibližně 120 Hz. Fyzický monitor může mít jinou frekvenci.

Kalibrace mění složitost uvnitř shaderu v rozsahu 1-4096. Počet průchodů zůstává pevný: čtyři postprocesy. Nejprve se hledá rozsah kolem cílového času, poté se zpřesní a zvolená konfigurace se ověří. Aby se stejný čas zabral na rychlé grafické kartě, je zapotřebí složitější práce.

V testech výkonu je objem práce pevný. V Loaded Latency se zátěž kalibruje, aby doba GPU práce byla na různých grafických kartách blízká. Získané časové značky se po měření nenormalizují.

Výstup snímků testu latence jde přes samostatnou prezentační cestu: bezrámové okno v režimu flip-discard, maximální latence snímku (maximum frame latency) 1, očekávaný objekt DXGI a tearing, pokud ho systém podporuje. Tato cesta je oddělena od pevné zátěže výkonu, která se vykonává mimo obrazový buffer a nevyvolává Present.

Pro události zobrazení se používá knihovna PresentMon 2.5.1. Jde o ETW projekt analýzy grafických událostí ve Windows, popsaný jeho autory. Procmon / Process Monitor se v tomto měřicím řetězci nepoužívá.

PCBenchmarkX spouští vlastní relaci sběru, vybírá události svého procesu a propojuje snímky se softwarovými signály. K tomu není potřeba samostatná služba ani ruční spuštění samostatného PresentMon.

Ukládají se další intervaly:

  • od signálu do Present;
  • od Present do ScreenTime;
  • od signálu do ScreenTime.

ScreenTime je softwarová událost zobrazení snímku; fotodioda pro měření světla z obrazovky se nepoužívá. V základním modelu CPU/GPU/Latency tvoří váhy Baseline a Loaded 20/80 uvnitř komponenty latence. Metriky zobrazení nejsou součástí PC Score; co je jeho součástí, je popsáno ve výpočtu skóre. Spuštění relace ETW může vyžadovat spuštění jako správce nebo členství ve skupině „Uživatelé protokolu výkonu“. Pokud se relaci nepodařilo spustit, blok této diagnostiky nebude a selhání se v výsledku zaznamená výslovně. Absence dat není totéž jako nulová latence.

GPU čas PresentMon se také ukládá odděleně od vlastního D3D12 času. Vývojáři PresentMon upozorňují na omezení přesnosti GPU metrik při HAGS. Proto engine nenahrazuje vlastní GPU timestamps odhadem z ETW.

Co je vyvinuto v PCBenchmarkX

Sekce “Co je vyvinuto v PCBenchmarkX”

V PCBenchmarkX jsou vyvinuty generátor signálů, přiřazení etap snímku, CPU simulace, D3D12 zátěže, kalibrace Loaded, pořadí opakujících se bloků, sběr měření, statistické zpracování a model skóre. QPC a D3D12 poskytuje Windows. Pro sběr grafických událostí přes ETW se používá otevřený projekt PresentMon.

Popis měření byl aktualizován 2026-10-02 pro engine 0.8.0. Dokumentace Microsoftu k QPC a D3D12 byla k tomuto datu znovu ověřena. Odkaz na PresentMon se vztahuje k používané verzi 2.5.1.