VSync

אות ה-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 תקופתיים שמבוססים על חומרה של מסך, ומשתמש במודל הזה כדי להפעיל קריאות חוזרות (callback) בהיסטים ספציפיים של פאזות מאירועי VSync של החומרה.

‫DispSync הוא לולאת נעילה (PLL) של תוכנה שיוצרת את האותות VSYNC ו-SF_VSYNC שמשמשים את Choreographer ו-SurfaceFlinger, גם אם אין היסט מ-VSync של החומרה.

התרשים הבא מדגים את תהליך DispSync:

תהליך 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.

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