VSYNC

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

זרימת DispSync

איור 1. זרימת DispSync

ל-DispSync יש את האיכויות הבאות:

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

קיזוז 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 ארוך.

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