İçeriğe geç

Gecikme ölçümü ve PresentMon

Sayfa içeriği

PCBenchmarkX, iç işleme gecikmesini ve kare çıkış gecikmesini ayrı ayrı ölçer. Bu yazılım metrikleri, fare tıklamasından ekrandaki pikselin yanmasına kadar olan tüm yolu tanımlamaz. Tam ölçüm döngüsü metodolojide açıklanmıştır.

Sabit akış, 8-12 ms aralıklarla deterministik sinyaller üretir. Windows izin verirse yüksek hassasiyetli bir bekleyen zamanlayıcı oluşturur; aksi halde normal bir bekleyen zamanlayıcı kullanır. Olay bekleme, çekirdeği meşgul edecek sürekli yoklamadan kaçınır. Sistem zamanlayıcısının genel çözünürlüğü bu sırada değişmez.

Her sinyal için planlanan süre, üreticinin uyanması, gerçek sinyal, alıcının uyanması, simülasyon, komut gönderimi, GPU zaman damgaları ve gösterim olayları kaydedilir. Ortak kare tanımlayıcısı tüm aşamaları birbirine bağlar.

Planlanan süre → üreticinin uyanması → sinyal
↓
alıcının uyanması
↓
CPU → komutlar → GPU
↓
Present → çıkış olayı

Bu şeritlerde hem zamanlayıcı gecikmesi hem de alıcının uyanma gecikmesi ayrı ayrı görülür. Core Latency’nin başlangıcı gerçek sinyaldir, bu nedenle bu metrikte planlanan süreden sinyale kadar olan adım sayılmaz.

Sonuç, ölçülen yolun latency_path aşama bazında dökümünü içerir — Baseline ve Loaded için ayrı ayrı. Aşamalar gerçek sinyalden itibaren sayılır:

Aşama Neyi ölçer
signal_to_consumer_wake sinyalden alıcının uyanmasına kadar
cpu_processing CPU işlemesi: simülasyon ve kare verilerinin hazırlanması
cpu_end_to_submit_start CPU işinin bitiminden gönderim hazırlığının başlangıcına kadar olan duraklama
workload_submit_cpu_span grafik API komutlarının hazırlanması ve yazılması
submit_start_to_gpu_begin hazırlığın başlangıcından GPU işinin başlangıcına kadar; bu saf kuyruk gecikmesi değildir
gpu_execution GPU işinin kendisinin yürütülmesi, GPU çevrimlerinde
presentation spans gösterim: Present sarmalayıcısı ve sinyalden ve GPU işinin bitiminden ScreenTime kadar olan aralıklar

Her aşama istatistikler ve persentiller içeren bir dağılım olarak verilir. Segmentler iki medyanın çıkarılmasıyla değil, her işaret çifti için ayrı ayrı hesaplanır. Bir aşamanın bitiş işareti yoksa veya güvenilmezse, dağılımı boş kalır — yerine konulmuş değer yoktur. Zamanlayıcı gecikmesi (planlanan süre ile gerçek sinyal arasındaki fark) sinyalden önce ayrı bir tanılama olarak kaydedilir ve yolun toplam değerlerine dahil edilmez.

CPU zamanı QueryPerformanceCounter üzerinden kaydedilir. GPU için motor, ölçülen işin etrafına iki timestamp query yerleştirir, kuyruk frekansını GetTimestampFrequency üzerinden alır ve tik farkını milisaniyeye çevirir:

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

Microsoft’un D3D12 timing belgelerine göre, timestamp query işin boru hattının sonuna kadar ilerlemesini yansıtır ve GPU ile CPU sayaçları GetClockCalibration üzerinden ilişkilendirilir.

GPU/QPC kalibrasyon çifti, GPU işinin tamamlanmasını sinyalle aynı zaman ölçeğinde ifade etmeyi sağlar:

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

Bu tahminin doğruluğu büyük ölçüde CPU ve GPU saatlerinin ne kadar doğru eşleştirildiğine bağlıdır. Yine de farenin USB yolunu, matris tarama süresini veya piksel tepkisini kapsamaz. Microsoft, yüksek hassasiyetli QPC işaretlerinin ayrıntılarını ayrıca açıklar.

Baseline, gecikmeyi bu yükün minimum yapılandırmasında ölçer. Loaded, 8,333333 ms değerine kalibre edilmiş GPU yüküyle, yani yaklaşık 120 Hz’lik bir hesaplama bütçesiyle çalışır. Fiziksel monitör farklı bir frekansa sahip olabilir.

Kalibrasyon, shader içindeki karmaşıklığı 1-4096 aralığında değiştirir. Geçiş sayısı sabit kalır: dört post-geçiş. Önce hedef süre etrafında bir aralık seçilir, ardından bu aralık daraltılır ve seçilen yapılandırma doğrulanır. Hızlı bir ekran kartında aynı süreyi doldurmak için daha karmaşık bir iş gerekir.

Performans testlerinde iş hacmi sabittir. Loaded Latency’de yük, GPU iş süresinin farklı ekran kartlarında yakın olması için kalibre edilir. Elde edilen zaman damgaları ölçümden sonra normalleştirilmez.

Gecikme testinin kare çıkışı ayrı bir sunum yolu üzerinden gider: flip-discard modunda çerçevesiz pencere, maksimum kare gecikmesi (maximum frame latency) 1, beklenen DXGI nesnesi ve sistem destekliyorsa tearing. Bu yol, ekran tamponu dışında yürütülen ve Present tetiklemeyen sabit performans yükünden ayrıdır.

Gösterim olayları için PresentMon 2.5.1 kütüphanesi kullanılır. Bu, Windows’ta grafik olaylarını analiz eden ve yazarları tarafından açıklanan bir ETW projesidir. Bu ölçüm hattında Procmon / Process Monitor kullanılmaz.

PCBenchmarkX kendi toplama oturumunu başlatır, kendi sürecinin olaylarını seçer ve kareleri yazılım sinyalleriyle ilişkilendirir. Bunun için ayrı bir hizmet ve ayrı bir PresentMon’un elle başlatılması gerekmez.

Ek aralıklar kaydedilir:

  • sinyalden Present kadar;
  • Present ile ScreenTime arasında;
  • sinyalden ScreenTime kadar.

ScreenTime yazılımsal kare gösterim olayıdır; ekrandan ışık ölçmek için fotodiyot kullanılmaz. Temel CPU/GPU/Latency modelinde Baseline ve Loaded ağırlıkları gecikme bileşeni içinde 20/80’dir. Gösterim metrikleri PC Score’a dahil değildir; nelerin dahil olduğu puan hesaplamasında açıklanmıştır. ETW oturumunu başlatmak, yönetici olarak çalıştırmayı veya “Performans Günlüğü Kullanıcıları” grubuna üyeliği gerektirebilir. Oturum başlatılamazsa bu tanılama bloğu olmaz ve hata sonuçta açıkça kaydedilir. Veri eksikliği sıfır gecikmeye eşit değildir.

PresentMon’un GPU zamanı da kendi D3D12 zamanından ayrı olarak saklanır. PresentMon geliştiricileri HAGS altında GPU metriklerinin doğruluk sınırlamalarını belirtir. Bu nedenle motor, kendi GPU timestamps’ını ETW tahminiyle değiştirmez.

PCBenchmarkX’te sinyal üreteci, kare aşamalarının eşleştirilmesi, CPU simülasyonu, D3D12 yükleri, Loaded kalibrasyonu, tekrarlanan blokların sırası, ölçüm toplama, istatistiksel işleme ve puan modeli geliştirilmiştir. QPC ve D3D12’i Windows sağlar. ETW üzerinden grafik olaylarını toplamak için açık kaynak PresentMon projesi kullanılır.

Ölçüm açıklaması, 0.8.0 motoru için 2026-10-02 tarihinde güncellenmiştir. Microsoft’un QPC ve D3D12 belgeleri bu tarihte yeniden kontrol edilmiştir. PresentMon bağlantısı, kullanılan 2.5.1 sürümüne aittir.