ארכיטקטורה גרפית

מה שכל מפתח צריך לדעת על משטחים, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger ו-Vulkan.

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

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

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

רכיבים ברמה נמוכה

  • BufferQueue ו- gralloc . BufferQueue מחבר משהו שיוצר מאגרים של נתונים גרפיים ( המפיק ) למשהו שמקבל את הנתונים לתצוגה או לעיבוד נוסף ( הצרכן ). הקצאת מאגר מתבצעת באמצעות מקצי הזיכרון gralloc המיושם באמצעות ממשק HAL ספציפי לספק.
  • SurfaceFlinger, Hardware Composer ותצוגות וירטואליות . SurfaceFlinger מקבל מאגרים של נתונים ממקורות מרובים, מרכיב אותם ושולח אותם לתצוגה. Hardware Composer HAL (HWC) קובע את הדרך היעילה ביותר להרכיב מאגרים עם החומרה הזמינה, ותצוגות וירטואליות הופכות פלט מורכב זמין בתוך המערכת (הקלטת המסך או שליחת המסך דרך רשת).
  • משטח, קנבס ו-SurfaceHolder . משטח מייצר תור חיץ שנצרך לעתים קרובות על ידי SurfaceFlinger. בעת עיבוד על משטח, התוצאה מסתיימת במאגר שנשלח לצרכן. ממשקי API של Canvas מספקים הטמעת תוכנה (עם תמיכה בהאצת חומרה) לציור ישירות על משטח (חלופה ברמה נמוכה ל-OpenGL ES). כל מה שקשור לתצוגה כרוך ב-SurfaceHolder, שממשקי ה-API שלו מאפשרים לקבל ולהגדיר פרמטרים של פני השטח כגון גודל ופורמט.
  • EGLSurface ו-OpenGL ES . OpenGL ES (GLES) מגדיר API לעיבוד גרפי שנועד להיות משולב עם EGL , ספרייה שיכולה ליצור ולגשת לחלונות דרך מערכת ההפעלה (כדי לצייר מצולעים בעלי מרקם, להשתמש בקריאות GLES; כדי לשים רינדור על המסך, להשתמש בקריאות EGL ). דף זה מכסה גם את ANativeWindow, המקבילה C/C++ למחלקה של Java Surface המשמשת ליצירת משטח חלון EGL מקוד מקורי.
  • וולקן . Vulkan הוא ממשק API חוצה פלטפורמות בעל תקורה נמוכה עבור גרפיקה תלת מימדית בעלת ביצועים גבוהים. כמו OpenGL ES, Vulkan מספקת כלים ליצירת גרפיקה באיכות גבוהה בזמן אמת באפליקציות. היתרונות של Vulkan כוללים הפחתת תקורה של CPU ותמיכה בשפת הביניים הבינארית SPIR-V .

רכיבים ברמה גבוהה

  • SurfaceView ו-GLSurfaceView . SurfaceView משלב משטח ונוף. רכיבי התצוגה של SurfaceView מורכבים על ידי SurfaceFlinger (ולא האפליקציה), ומאפשרים רינדור משרשור/תהליך נפרד ובידוד מעיבוד ממשק המשתמש של האפליקציה. GLSurfaceView מספקת כיתות עוזרות לניהול הקשרים של EGL, תקשורת בין חוטים ואינטראקציה עם מחזור החיים של הפעילות (אך לא נדרש להשתמש ב-GLES).
  • מרקם פני השטח . SurfaceTexture משלב משטח ומרקם GLES כדי ליצור BufferQueue שעבורו האפליקציה שלך היא הצרכן. כאשר מפיק מעמיד בתור מאגר חדש, הוא מודיע לאפליקציה שלך, אשר בתורה משחררת את המאגר שהוחזק קודם לכן, רוכש את המאגר החדש מהתור, ומבצע קריאות EGL כדי להפוך את המאגר לזמין ל-GLES כמרקם חיצוני. אנדרואיד 7.0 הוסיפה תמיכה לניגון וידאו במרקם מאובטח המאפשר עיבוד לאחר עיבוד גרפי של תוכן וידאו מוגן.
  • TextureView . TextureView משלב תצוגה עם SurfaceTexture. TextureView עוטף SurfaceTexture ולוקח אחריות על התגובה להתקשרות חוזרת ורכישת מאגרים חדשים. בעת ציור, TextureView משתמש בתוכן של המאגר שהתקבל לאחרונה כמקור הנתונים שלו, ומציג בכל מקום ואיך שמצב התצוגה מציין שהוא צריך. הרכב תצוגה מבוצע תמיד עם GLES, כלומר עדכונים לתוכן עשויים לגרום גם לרכיבי תצוגה אחרים לצייר מחדש.