SurfaceFlinger ו- WindowManager

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

SurfaceFlinger

SurfaceFlinger יכול לקבל מאגרים בשתי דרכים: דרך BufferQueue ו- SurfaceControl, או דרך ASurfaceControl.

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

אנדרואיד 10 מוסיף את ASurfaceControl, שזו דרך נוספת שבה SurfaceFlinger יכול לקבל חוצצים. ASurfaceControl משלבת משטח ו-SurfaceControl בחבילת עסקאות אחת הנשלחת ל-SurfaceFlinger. ASurfaceControl משויך לשכבה, שאותה אפליקציות מעדכנות באמצעות ASurfaceTransactions. לאחר מכן, יישומים מקבלים מידע על ASurfaceTransactions באמצעות התקשרויות חוזרות שעוברות ASurfaceTransactionStats המכילות מידע, כגון זמן נעילה, זמני רכישה וכן הלאה.

הטבלה הבאה כוללת פרטים נוספים על ASurfaceControl והרכיבים המשויכים לה.

רְכִיב תיאור
ASurfaceControl עוטף את SurfaceControl ומאפשר לאפליקציה ליצור SurfaceControls התואמים לשכבות בתצוגה.

ניתן ליצור כילד של ANativeWindow או כילד של ASurfaceControl אחר.
ASurfaceTransaction עוטף את העסקה כדי לאפשר ללקוח לערוך את המאפיינים התיאוריים של שכבה, כגון גיאומטריה, ושולח את המאגרים המעודכנים ל- SurfaceFlinger.
ASurfaceTransactionStats שולח מידע על עסקאות שהוצגו, כגון זמן נעילה, זמני רכישה וגדר שחרור קודמת, לאפליקציה באמצעות התקשרות חוזרת רשומה מראש.

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

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

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

WindowsManager

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

סיבוב מראש

שכבות חומרה רבות אינן תומכות בסיבוב (וגם אם כן, זה עולה כוח עיבוד); הפתרון הוא להפוך את המאגר לפני שהוא מגיע ל- SurfaceFlinger. אנדרואיד תומך ברמז שאילתה ( NATIVE_WINDOW_TRANSFORM_HINT ) ב- ANativeWindow כדי לייצג את הטרנספורמציה הסבירה ביותר שתחול על המאגר על ידי SurfaceFlinger. מנהלי התקנים של GL יכולים להשתמש ברמז זה כדי לשנות מראש את המאגר לפני שהוא מגיע ל- SurfaceFlinger כך שכאשר המאגר יגיע, הוא יעבור טרנספורמציה נכונה.

לדוגמה, כאשר מקבלים רמז לסובב 90 מעלות, צור והחל מטריצה ​​על המאגר כדי למנוע ממנו לרוץ מסוף העמוד. כדי לחסוך בחשמל, בצע את הסיבוב הזה מראש. לפרטים, עיין בממשק ANativeWindow המוגדר ב- system/core/include/system/window.h .