גרָפִיקָה

סמל אנדרואיד גרפיקה HAL

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

מפתחי אפליקציות מציירים תמונות למסך בשלוש דרכים: עם Canvas , OpenGL ES או Vulkan .

רכיבים גרפיים של אנדרואיד

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

התרשים הבא מראה כיצד מרכיבי המפתח פועלים יחד:

רכיבי עיבוד תמונה

איור 1. כיצד משטחים מעובדים

המרכיבים העיקריים מתוארים להלן:

מפיקי זרם תמונות

מפיק זרם תמונה יכול להיות כל דבר שמייצר מאגרים גרפיים לצריכה. דוגמאות כוללות OpenGL ES, Canvas 2D ומפענחי וידאו של שרת מדיה.

צרכני זרם תמונות

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

אפליקציות אחרות של OpenGL ES יכולות לצרוך זרמי תמונות גם כן, כמו אפליקציית המצלמה שצורכת זרם תמונה של תצוגה מקדימה של המצלמה. יישומים שאינם GL יכולים להיות גם צרכנים, למשל מחלקת ImageReader.

מלחין חומרה

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

Hardware Composer HAL מנהל את החצי השני של העבודה ומהווה את הנקודה המרכזית לכל עיבוד גרפי אנדרואיד. ה-Hardware Composer חייב לתמוך באירועים, אחד מהם הוא VSYNC (אחר הוא hotplug לתמיכה ב-plug-and-playHDMI).

גראלוק

יש צורך במקצי הזיכרון הגרפי (Galloc) כדי להקצות זיכרון המבוקש על ידי יצרני תמונות. לפרטים, ראה Gralloc HAL .

זרימת נתונים

עיין בתרשים הבא לתיאור של צינור הגרפיקה של אנדרואיד:

זרימת נתונים גרפית

איור 2. זרימת נתונים גרפית דרך אנדרואיד

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

BufferQueue

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

עיין בתרשים הבא עבור תהליך התקשורת BufferQueue.

תהליך תקשורת BufferQueue

איור 3. תהליך תקשורת BufferQueue

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

BufferQueue הוא מבנה נתונים המשלב מאגר חיץ עם תור ומשתמש ב-Binder IPC כדי להעביר מאגרים בין תהליכים. ממשק היצרן, או מה שאתה מעביר למישהו שרוצה ליצור מאגרים גרפיים, הוא IGraphicBufferProducer (חלק מ- SurfaceTexture ). BufferQueue משמש לעתים קרובות לעיבוד ל-Surface ולצרוך עם GL Consumer, בין שאר המשימות.

BufferQueue יכול לפעול בשלושה מצבים שונים:

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

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

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

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

ה- Hardware Composer HAL מנהל את החצי השני של העבודה. HAL זה משמש כנקודה המרכזית לכל עיבוד גרפי אנדרואיד.