אות ה-VSync מסנכרן את צינור התצוגה. צינור העיבוד של התצוגה מורכב מרינדור האפליקציה, קומפוזיציה של SurfaceFlinger והצגת תמונות במסך על ידי Hardware Composer (HWC). VSync מסנכרן את הזמן שבו האפליקציות מתעוררות כדי להתחיל ברינדור, את הזמן שבו SurfaceFlinger מתעורר כדי ליצור קומפוזיציה של המסך ואת מחזור הרענון של התצוגה. הסנכרון הזה מונע גמגום ומשפר את הביצועים החזותיים של הגרפיקה.
ה-HWC יוצר אירועי VSync ושולח אותם ל-SurfaceFlinger באמצעות הקריאה החוזרת:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger קובע אם ה-HWC יוצר אירועי VSync על ידי קריאה ל-setVsyncEnabled
. SurfaceFlinger מאפשר ל-setVsyncEnabled
ליצור אירועי VSync כדי לסנכרן עם מחזור הרענון של המסך. כש-SurfaceFlinger מסונכרן עם מחזור הרענון של המסך, הוא משבית את setVsyncEnabled
כדי למנוע מ-HWC ליצור אירועי VSync. אם SurfaceFlinger מזהה הבדל בין ה-VSync בפועל לבין ה-VSync שהוא קבע קודם, הוא מפעיל מחדש את יצירת אירועי ה-VSync.
הזחות של VSync
אפליקציית הסנכרון ולולאות העיבוד של SurfaceFlinger מסונכרנות עם VSync של החומרה. באירוע VSync, המסך מתחיל להציג את הפריים N בזמן ש-SurfaceFlinger מתחיל להרכיב חלונות לפריים N+1. האפליקציה מטפלת בקלט בהמתנה ומפיקה את הפריים N+2.
סנכרון עם VSync מספק השהיה עקבית. היא מפחיתה שגיאות באפליקציות וב-SurfaceFlinger ומצמצמת את התנודות של המסכים פנימה והחוצה מהפאזה אחד עם השני. ההנחה היא שמשכי הזמן של כל פריים באפליקציה וב-SurfaceFlinger לא משתנים באופן משמעותי. ההשהיה היא לפחות שתי מסגרות.
כדי לפתור את הבעיה הזו, אפשר להשתמש בהיסטים של VSync כדי להפחית את זמן האחזור מהקלט לתצוגה. לשם כך, צריך להגדיר את האפליקציה ואת אות ההרכבה ביחס ל-VSync של החומרה. הדבר אפשרי כי בדרך כלל הרכבת האפליקציה נמשכת פחות מ-33 אלפיות השנייה.
התוצאה של היסט VSync היא שלושה אותות עם אותו מחזור והיסט פאזה:
-
HW_VSYNC_0
— הצגת הפריים הבא מתחילה. -
VSYNC
— האפליקציה קוראת את הקלט ומפיקה את המסגרת הבאה. -
SF_VSYNC
— SurfaceFlinger מתחיל ליצור קומפוזיציה למסגרת הבאה.
עם היסטים של VSync, SurfaceFlinger מקבל את המאגר ויוצר את הפריים, בזמן שהאפליקציה מעבדת את הקלט ומבצעת רינדור של הפריים.
DispSync
DispSync מתחזק מודל של אירועי VSync תקופתיים שמבוססים על חומרה של תצוגה, ומשתמש במודל הזה כדי להפעיל קריאות חוזרות בהיסטים ספציפיים של פאזות מאירועי VSync של החומרה.
DispSync הוא לולאת נעילה (PLL) של תוכנה שיוצרת את האותות VSYNC
ו-SF_VSYNC
שמשמשים את Choreographer ו-SurfaceFlinger, גם אם אין היסט מ-VSync של החומרה.
התרשים הבא מדגים את תהליך DispSync:

איור 1. תהליך DispSync.
ל-DispSync יש את המאפיינים הבאים:
- חומרי עזר –
HW_VSYNC_0
. - פלט –
VSYNC
ו-SF_VSYNC
. - משוב – הוצאת חותמות הזמן של אותות הגדר הווירטואלית מ-HWC.
היסטים של VSync להוצאה משימוש
חותמת הזמן של האות של גדרות ההוצאה משימוש צריכה להיות זהה ל-HW VSync, גם במכשירים שלא משתמשים בשלב ההיסט. אחרת, השגיאות ייראו חמורות יותר ממה שהן באמת. לרוב, בחלוניות חכמות יש דלתא שבה גדר ההוצאה משימוש היא סוף הגישה הישירה לזיכרון (DMA) לזיכרון התצוגה, אבל המעבר בפועל לתצוגה ו-HW VSync מתרחשים זמן מה לאחר מכן.
המאפיין PRESENT_TIME_OFFSET_FROM_VSYNC_NS
מוגדר בקובץ ה-makefile של המכשיר BoardConfig.mk
. היא מבוססת על בקר התצוגה ומאפייני הפאנל. הזמן שחולף מחותמת הזמן של גדר ההוצאה משימוש ועד לאות HW VSync
נמדד בננו-שניות.
היסטים של VSYNC ו-SF_VSYNC
הערכים של VSYNC_EVENT_PHASE_OFFSET_NS
ו-SF_VSYNC_EVENT_PHASE_OFFSET_NS
מוגדרים באופן שמרני על סמך תרחישי שימוש בעומס גבוה, כמו קומפוזיציה חלקית של GPU במהלך מעבר בין חלונות או גלילה ב-Chrome בדף אינטרנט שמכיל אנימציות. ההיסטים האלה מאפשרים זמן עיבוד ארוך של האפליקציה וזמן הרכבה ארוך של ה-GPU.
זמן אחזור של יותר ממילי-שנייה או שתיים מורגש. כדי לצמצם את זמן האחזור בלי להגדיל באופן משמעותי את מספר השגיאות, כדאי לשלב בדיקות אוטומטיות מקיפות של שגיאות.