דלגו לתוכן

מדידת השהיות ו-PresentMon

בדף זה

PCBenchmarkX מודד בנפרד את השהיה הפנימית של העיבוד ואת השהיית פלט הפריים. מדדים תוכנתיים אלה אינם מתארים את כל המסלול מלחיצת העכבר ועד להארת הפיקסל על המסך. מחזור המדידה המלא מתואר במתודולוגיה.

זרם קבוע מייצר אותות במרווחים דטרמיניסטיים של 8-12 מ״ש. אם Windows מאפשר, הוא יוצר טיימר ממתין ברמת דיוק גבוהה; אחרת הוא משתמש בטיימר ממתין רגיל. ההמתנה לאירוע מתבצעת ללא סקירה רציפה, שהייתה תופסת את הליבה. רזולוציית הטיימר המערכתית הגלובלית אינה משתנה בכך.

עבור כל אות נרשמים המועד המתוכנן, היקיצה של המחולל, האות בפועל, היקיצה של המקבל, הסימולציה, שליחת הפקודות, חותמות הזמן של GPU ואירועי התצוגה. מזהה פריים משותף מקשר בין כל השלבים.

מועד מתוכנן → יקיצת המחולל → אות
↓
יקיצת המקבל
↓
CPU → פקודות → GPU
↓
Present → אירוע פלט

ברצפים אלה נראים בנפרד גם האיחור של הטיימר וגם השהיית היקיצה של המקבל. תחילת Core Latency — זה האות בפועל, ולכן הצעד מהמועד המתוכנן ועד לאות אינו נספר במדד זה.

פירוק לפי שלבים של מסלול ההשהיה

Section titled “פירוק לפי שלבים של מסלול ההשהיה”

התוצאה מכילה פירוק לפי שלבים של המסלול הנמדד latency_path — בנפרד עבור Baseline ו-Loaded. השלבים נספרים מהאות בפועל:

שלב מה נמדד
signal_to_consumer_wake מהאות ועד ליקיצת המקבל
cpu_processing עיבוד CPU: הסימולציה והכנת נתוני הפריים
cpu_end_to_submit_start ההפסקה מסוף עבודת ה-CPU ועד לתחילת הכנת השליחה
workload_submit_cpu_span הכנה וכתיבה של פקודות ה-API הגרפי
submit_start_to_gpu_begin מתחילת ההכנה ועד לתחילת עבודת ה-GPU; זו אינה השהיית תור טהורה
gpu_execution ביצוע עבודת ה-GPU עצמה, במחזורי GPU
presentation spans תצוגה: העטיפה של Present והמרווחים מהאות ומסוף עבודת ה-GPU ועד ל-ScreenTime

כל שלב ניתן כהתפלגות עם סטטיסטיקות ואחוזונים. המקטעים מחושבים עבור כל זוג סימונים בנפרד, ולא על ידי חיסור של שני חציונים. אם סימון הסיום של שלב חסר או אינו מהימן, ההתפלגות שלו נשארת ריקה — אין ערכים מומצאים. האיחור של הטיימר (הפער בין המועד המתוכנן לאות בפועל) נרשם כאבחון נפרד לפני האות ואינו נכלל בערכי המסלול הכוללים.

QPC וחותמות זמן GPU עצמאיות

Section titled “QPC וחותמות זמן GPU עצמאיות”

זמן ה-CPU נרשם דרך QueryPerformanceCounter. עבור GPU המנוע מציב שתי timestamp query סביב העבודה הנמדדת, מקבל את תדר התור דרך GetTimestampFrequency וממיר את הפרש המחזורים למילישניות:

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

לפי תיעוד Microsoft על תזמון D3D12, timestamp query משקף את התקדמות העבודה עד סוף הצינור, ומוני ה-GPU וה-CPU מקושרים דרך GetClockCalibration.

זוג כיול של GPU/QPC מאפשר לבטא את סיום עבודת ה-GPU על אותה סקאלת זמן כמו האות:

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

דיוק האומדן הזה תלוי במידה רבה בכמה מדויקת ההתאמה בין שעון ה-CPU לשעון ה-GPU. הוא בכל מקרה אינו מכסה את מסלול ה-USB של העכבר, את זמן הסריקה של המטריצה או את תגובת הפיקסל. Microsoft מתארת בנפרד את הדקויות של סימוני QPC ברמת דיוק גבוהה.

Baseline מודד את ההשהיה בתצורה מינימלית של העומס הזה. Loaded עובד עם עומס GPU מכויל ל-8,333333 מ״ש, כלומר לתקציב חישובי של כ-120 הרץ. למסך הפיזי עשויה להיות תדירות אחרת.

הכיול משנה את המורכבות בתוך השיידר בטווח 1-4096. מספר המעברים נשאר קבוע: ארבעה מעברי פוסט. תחילה נבחר טווח סביב הזמן היעד, לאחר מכן הוא מו refined והתצורה הנבחרת נבדקת. כדי לתפוס את אותו זמן בכרטיס מסך מהיר, נדרשת עבודה מורכבת יותר.

במבחני ביצועים היקף העבודה קבוע. ב-Loaded Latency העומס מכויל כך שזמן עבודת ה-GPU יהיה קרוב בכרטיסי מסך שונים. חותמות הזמן המתקבלות לאחר המדידה אינן מנורמלות.

פלט הפריימים של מבחן ההשהיה עובר דרך מסלול תצוגה נפרד: חלון ללא מסגרת במצב flip-discard, השהיית פריים מקסימלית (maximum frame latency) 1, אובייקט DXGI ממתין ו-tearing, אם המערכת תומכת בו. מסלול זה מופרד מהעומס הקבוע של הביצועים, שמבוצע מחוץ למאגר המסך ואינו גורם ל-Present.

עבור אירועי התצוגה משמשת הספרייה PresentMon 2.5.1. זהו פרויקט ETW לניתוח אירועים גרפיים ב-Windows, המתואר על ידי מחבריו. Procmon / Process Monitor אינו משמש בצינור המדידה הזה.

PCBenchmarkX מרים סשן איסוף משלו, מסנן אירועים של התהליך שלו ומקשר פריימים לאותות התוכנתיים. לשם כך אין צורך בשירות נפרד ובהרצה ידנית של PresentMon נפרד.

נשמרים מרווחים נוספים:

  • מהאות ועד ל-Present;
  • מ-Present ועד ל-ScreenTime;
  • מהאות ועד ל-ScreenTime.

ScreenTime — זהו אירוע תוכנתי של תצוגת פריים; פוטודיודה למדידת אור מהמסך אינה משמשת. במודל הבסיסי של CPU/GPU/Latency המשקלים של Baseline ו-Loaded הם 20/80 בתוך רכיב ההשהיה. מדדי התצוגה אינם נכללים ב-PC Score; מה כן נכלל מתואר בחישוב הניקוד. הרמת סשן ETW עשויה לדרוש הרצה בשם מנהל או חברות בקבוצה «משתמשי יומן הביצועים». אם לא ניתן היה להרים את הסשן, בלוק האבחון הזה לא יהיה, והכשל נרשם בתוצאה במפורש. היעדר נתונים אינו שווה להשהיה אפס.

זמן ה-GPU של PresentMon נשמר גם הוא בנפרד מזמן ה-D3D12 העצמאי. מפתחי PresentMon מציינים מגבלות דיוק של מדדי GPU תחת HAGS. לכן המנוע אינו מחליף את חותמות הזמן העצמאיות של ה-GPU באומדן מ-ETW.

ב-PCBenchmarkX פותחו המחולל של האותות, ההתאמה בין שלבי הפריים, הסימולציה של CPU, עומסי ה-D3D12, הכיול של Loaded, סדר הבלוקים החוזרים, איסוף המדידות, העיבוד הסטטיסטי ומודל הניקוד. QPC ו-D3D12 מסופקים על ידי Windows. לאיסוף אירועים גרפיים דרך ETW משמש הפרויקט הפתוח PresentMon.

תיאור המדידה עודכן ב-2026-10-02 עבור המנוע 0.8.0. התיעוד של Microsoft על QPC ו-D3D12 נבדק מחדש בתאריך זה. הקישור ל-PresentMon מתייחס לגרסה בשימוש 2.5.1.