VSYNC

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

קיזוז VSYNC

אפליקציית הסנכרון ו- SurfaceFlinger מעבירים לולאות לחומרה VSYNC. על אירוע VSync, התצוגה מתחילה להראות מסגרת N בעוד SurfaceFlinger מתחיל compositing חלונות עבור מסגרת N + 1. ידיות האפליקציה ממתינות קלט ומייצרת מסגרת N + 2.

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

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

התוצאה של קיזוז VSYNC היא שלושה אותות בעלי אותה תקופה ושלב קיזוז:

  • HW_VSYNC_0 - תצוגה מתחיל להראות בפריים הבא.
  • VSYNC - App קורא קלט ומייצר הפריים הבא.
  • SF_VSYNC - SurfaceFlinger מתחיל compositing עבור המסגרת הבאה.

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

DispSync

DispSync שומר על מודל של אירועי VSYNC התקופתיים המבוססים על חומרה של תצוגה ומשתמש במודל זה לביצוע שיחות חזרה בקיזוזים ספציפיים מאירועי VSYNC החומרה.

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

זרימת DispSync

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

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

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

קיזוז VSYNC/פרישה

חותמת האותות של גדרות הפנסיה חייבת להתאים ל- HW VSYNC, אפילו במכשירים שאינם משתמשים בשלב הקיזוז. אחרת, נראה כי השגיאות חמורות יותר ממה שהן. ללוחות חכמים יש לעתים קרובות דלתא שבה גדר הפרישה היא סופה של גישה ישירה לזיכרון (DMA) להצגת זיכרון, אך מתג התצוגה בפועל ו- HW VSYNC הוא זמן מה מאוחר יותר.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS מוגדר של המכשיר BoardConfig.mk makefile. זה מבוסס על בקר התצוגה ומאפייני הלוח. הזמן מחותמת הזמן של גדר הפרישה ועד לאות HY VSYNC נמדד בננו -שניות.

קיזוז VSYNC ו- SF_VSYNC

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

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