שכבות ותצוגות

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

שכבות

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

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

תצוגות

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

תצוגות וירטואליות

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

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

ביישומי HWC התומכים בהם, ניתן לחבר תצוגות וירטואליות עם OpenGL ES (GLES), HWC, או גם GLES וגם HWC. ביישומים שאינם תומכים, תצוגות וירטואליות תמיד מורכבות באמצעות GLES.

מקרה מבחן: תיעוד מסך

הפקודה screenrecord מאפשרת למשתמש להקליט את כל מה שמופיע על המסך כקובץ .mp4 בדיסק. כדי ליישם זאת, המערכת מקבלת פריימים מורכבים מ-SurfaceFlinger, כותבת אותם למקודד הווידאו, ולאחר מכן כותבת את נתוני הווידאו המקודדים לקובץ. רכיבי ה-codec של הווידאו מנוהלים על ידי תהליך נפרד ( mediaserver ), כך שמאגרים גרפיים גדולים צריכים לנוע ברחבי המערכת. כדי להפוך את זה למאתגר יותר, המטרה היא להקליט וידאו של 60 פריימים לשנייה ברזולוציה מלאה. המפתח לביצוע עבודה יעילה הוא BufferQueue.

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

לאחר מכן, כלי screenrecord מבקש מ-SurfaceFlinger ליצור תצוגה וירטואלית המשקפת את התצוגה הראשית (כלומר, יש לה את כל אותן השכבות), ומפנה אותה לשלוח פלט למשטח שהגיע מתהליך mediaserver . במקרה זה, SurfaceFlinger הוא היצרן של מאגרים ולא הצרכן.

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

מקרה מבחן: הדמיית תצוגות משניות

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

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