גרפיקה

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

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

קנבס (מונח כללי), Canvas (אלמנט API)
קנבס הוא משטח ציור שמטפל בשילוב של הסיביות בפועל מול מפת סיביות או אובייקט Surface . Canvas יש שיטות לציור מחשב סטנדרטי של מפות סיביות, קווים, עיגולים, מלבנים, טקסט וכן הלאה, והוא קשור למפת סיביות או למשטח. קנבס הוא הדרך הפשוטה והקלה ביותר לצייר אובייקטים דו-ממדיים על המסך. מחלקת הבסיס היא Canvas .
ניתן למשיכה
ניתן לצייר הוא משאב חזותי מלוקט שיכול לשמש כרקע, כותרת או חלק אחר של המסך. ניתן לצייר בדרך כלל לרכיב UI אחר, למשל כתמונת רקע. ניתן לצייר לא מסוגל לקבל אירועים, אבל כן מקצה מאפיינים שונים אחרים כגון מצב ותזמון, כדי לאפשר תת-מחלקות כגון אובייקטי אנימציה או ספריות תמונות. אובייקטים ניתנים לצייר רבים נטענים מקבצי משאבים ניתנים למשיכה - קבצי XML או מפת סיביות שמתארים את התמונה. משאבים ניתנים למשיכה מקובצים לתתי מחלקות של android.graphics.drawable . למידע נוסף על מושבים ומשאבים אחרים, ראה משאבים .
משאב פריסה
משאב פריסה הוא קובץ XML שמתאר את הפריסה של מסך פעילות. למידע נוסף, ראה משאב פריסה .
nine-patch (9-patch, NinePatch)
תיקון תשע הוא משאב מפת סיביות שניתן לשנות את גודלו שניתן להשתמש בו עבור רקעים או תמונות אחרות במכשיר. למידע נוסף, ראה Nine-patch .
OpenGL ES
OpenGL ES הוא ממשק API חוצה פלטפורמות לעיבוד גרפיקה דו-ממדית ותלת-ממדית. אנדרואיד מספקת ספריות OpenGL ES לעיבוד תלת מימדי מואץ בחומרה. עבור רינדור דו-ממדי, קנבס הוא האפשרות הפשוטה יותר. OpenGL ES זמין בערכת הפיתוח המקורית של Android (NDK) . החבילות android.opengl ו- javax.microedition.khronos.opengles חושפות את הפונקציונליות של OpenGL ES.
משטח (מונח כללי), Surface (אלמנט API)
משטח מייצג גוש זיכרון שמתחבר למסך. משטח מחזיק בד לציור, ומספק שיטות מסייעות שונות לצייר שכבות ולשנות את גודל אובייקט Surface . השתמש במחלקת SurfaceView במקום במחלקת Surface ישירות.
תצוגת משטח (מונח כללי), SurfaceView (אלמנט API)
תצוגת משטח היא אובייקט View העוטף אובייקט Surface לציור, וחושף שיטות לציון גודלו ופורמטו באופן דינמי. תצוגת משטח מספקת דרך לצייר ללא תלות בחוט ממשק המשתמש עבור פעולות עתירות משאבים, כגון משחקים או תצוגה מקדימה של מצלמה, אך היא משתמשת בזיכרון נוסף כתוצאה מכך. תצוגת משטח תומכת הן בגרפיקה של קנבס והן בגרפיקה של OpenGL ES. מחלקת הבסיס של אובייקט SurfaceView היא SurfaceView .
נושא
ערכת נושא היא קבוצה של מאפיינים, כגון גודל טקסט וצבע רקע, המאוגדים יחד כדי להגדיר הגדרות תצוגה שונות ברירת מחדל. אנדרואיד מספקת כמה ערכות נושא סטנדרטיות, המפורטות ב- R.style ובראשן Theme_ .
view (מונח כללי), View (אלמנט API)
תצוגה מציירת אזור מלבני על המסך ומטפלת בלחיצה, הקשות ואירועי אינטראקציה אחרים. המחלקה View היא המחלקה הבסיסית עבור רוב רכיבי הפריסה של מסך פעילות או דו-שיח, כגון תיבות טקסט וחלונות. אובייקט View מקבל קריאות מאובייקט האב שלו (ראה ViewGroup ) לצייר את עצמו, ומודיע לאובייקט האב שלו על הגודל והמיקום המועדף שלו, מה שאולי לא יכבד על ידי האב. למידע נוסף, ראה View .
קבוצת תצוגה (מונח כללי), ViewGroup (אלמנט API)
קבוצת תצוגה מקבצת קבוצה של תצוגות צאצא. קבוצת התצוגה אחראית להחליט היכן ממוקמות תצוגות ילדים וכמה גדולות הן יכולות להיות, כמו גם לקרוא לכל אחד לצייר את עצמו כאשר מתאים. חלק מקבוצות הצפייה אינן נראות והן מיועדות לפריסה בלבד, בעוד שלאחרות יש ממשק משתמש פנימי, כגון תיבת רשימה גלילה. קבוצות תצוגה נמצאות בחבילת widget , אך הרחיבו את מחלקת ViewGroup .
לראות היררכיה
היררכיית תצוגה היא סידור של אובייקטי קבוצת תצוגה ותצוגה המגדיר את ממשק המשתמש עבור כל רכיב של אפליקציה. ההיררכיה מורכבת מקבוצות תצוגה המכילות תצוגת צאצא או קבוצת תצוגה אחת או יותר. אתה יכול לקבל ייצוג חזותי של היררכיית תצוגות לאיתור באגים ואופטימיזציה על ידי שימוש במציג ההיררכיה שמסופק עם ה-SDK של Android.
וולקן
Vulkan הוא ממשק API חוצה פלטפורמות נמוך עבור גרפיקה תלת מימדית בעלת ביצועים גבוהים.
יישומון
ווידג'ט הוא אחד מקבוצה של תת-מחלקות תצוגות מיושמות במלואן המציגות רכיבי טופס ורכיבי ממשק משתמש אחרים, כגון תיבת טקסט או תפריט קופץ. מכיוון שווידג'ט מיושם במלואו, הוא מטפל במדידה, בציור עצמו ובתגובה לאירועי מסך. ווידג'טים נמצאים בחבילת android.widget .
חלון (מונח כללי), Window (אלמנט API)
באפליקציית אנדרואיד, חלון הוא אובייקט שמקורו במחלקה אבסטרקטית של Window המציינת את האלמנטים של חלון גנרי, כגון המראה והתחושה, טקסט שורת הכותרת ומיקום ותוכן של תפריטים. דיאלוגים ופעילויות משתמשים ביישום של המחלקה Window כדי לעבד אובייקט Window . אינך צריך ליישם את מחלקת Window או להשתמש בחלונות באפליקציה שלך.

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

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

לא משנה באיזה רינדור משתמשים מפתחי 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 זה משמש כנקודה המרכזית לכל עיבוד גרפי אנדרואיד.