VSYNC

האות VSYNC מסנכרן את צינור עיבוד הנתונים של התצוגה. צינור עיבוד הנתונים של המסך מורכב מעיבוד של אפליקציות, קומפוזיציה של SurfaceFlinger והצגת תמונות על המסך על ידי Hardware Composer‏ (HWC). VSYNC מסנכרן את הזמן שבו האפליקציות מתעוררות כדי להתחיל את העיבוד, את הזמן שבו SurfaceFlinger מתעורר כדי ליצור את המסך ואת מחזור הרענון של המסך. הסנכרון הזה מבטל את הגמגום ומשפר את הביצועים החזותיים של הגרפיקה.

ה-HWC יוצר אירועי VSYNC ושולח אותם ל-SurfaceFlinger דרך הקריאה החוזרת (callback):

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 offset

אפליקציית הסנכרון ו-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 תקופתיים שמבוססים על חומרה של צג, ומשתמש במודל הזה כדי להריץ קריאות חזרה (callbacks) במרווחי זמן ספציפיים של שלבים מאירועי VSYNC של החומרה.

DispSync הוא לולאה נעילה של פאזה (PLL) בתוכנה שמפיקה את האותות VSYNC ו-SF_VSYNC שבהם משתמשים Choreographer ו-SurfaceFlinger, גם אם הם לא מוסטים מ-VSYNC בחומרה.

תהליך DispSync

איור 1. תהליך DispSync

ל-DispSync יש את המאפיינים הבאים:

  • Reference – HW_VSYNC_0.
  • פלט – VSYNC ו-SF_VSYNC.
  • משוב – הסרת חותמות הזמן של אותות הגדרת גבולות מ-Hardware Composer.

VSYNC/retire offset

חותמת הזמן של האות של גדרות ההוצאה משימוש חייבת להתאים ל-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.

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