BufferQueue ו- Gralloc

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

מקצי הזיכרון של Gralloc מבצע הקצאות מאגר ומיושם באמצעות שני ממשקי HIDL ספציפיים לספק (ראה hardware/interfaces/graphics/allocator/ וחומרה hardware/interfaces/graphics/mapper/ ). הפונקציה allocate() לוקחת ארגומנטים צפויים (רוחב, גובה, פורמט פיקסל) וכן קבוצה של דגלי שימוש.

יצרנים וצרכנים של BufferQueue

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

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

תוכן המאגר לעולם אינו מועתק על ידי BufferQueue, מכיוון שהעברת נתונים רבים אינה יעילה. במקום זאת, מאגרים מועברים תמיד על ידי ידית אחיזה.

עקוב אחר BufferQueue עם Systrace

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

כדי להשתמש ב-Systrace, הפעל את התגיות gfx , view sched . אובייקטים BufferQueue מוצגים במעקב. כדוגמה, אם אתה לוקח מעקב בזמן שהסרטון Play של Grafika (SurfaceView) פועל, השורה שכותרתה SurfaceView אומרת לך כמה מאגרים היו בתור בכל זמן נתון.

הערך גדל בזמן שהאפליקציה פעילה, מה שמפעיל את עיבוד הפריימים על ידי מפענח MediaCodec. הערך יורד בזמן ש- SurfaceFlinger עובד וצורך מאגרים. כאשר מציגים וידאו במהירות של 30 פריימים לשנייה, ערך התור משתנה מ-0 ל-1 מכיוון שהתצוגה של ~60 פריימים לשנייה יכולה לעמוד בקצב המקור. SurfaceFlinger מתעורר רק כשיש עבודה לעשות, לא 60 פעמים בשנייה. המערכת מנסה להימנע מעבודה ומשביתה את VSYNC אם שום דבר לא מעדכן את המסך.

אם תעבור לסרטון Play של Grafika (TextureView) ותופס מעקב חדש, תראה שורה שכותרתה com.android.grafika / com.android.grafika.PlayMovieActivity . זוהי שכבת ממשק המשתמש הראשית, שהיא עוד BufferQueue. מכיוון ש-TextureView מעבד לשכבת ממשק המשתמש במקום לשכבה נפרדת, כל העדכונים מונעי הווידאו מוצגים כאן.

גראלוק

Gralloc allocator HAL hardware/libhardware/include/hardware/gralloc.h מבצע הקצאות מאגר באמצעות דגלי שימוש. דגלי שימוש כוללים תכונות כגון:

  • באיזו תדירות תהיה גישה לזיכרון מתוכנה (CPU)
  • באיזו תדירות תהיה גישה לזיכרון מחומרה (GPU)
  • האם הזיכרון ישמש כמרקם OpenGL ES (GLES).
  • האם הזיכרון ישמש מקודד וידאו

לדוגמה, אם פורמט המאגר של מפיק מציין RGBA_8888 פיקסלים, והמפיק מציין שהמאגר ייגש מתוכנה (כלומר אפליקציה תיגע בפיקסלים במעבד), Gralloc יוצר מאגר עם 4 בתים לפיקסל בסדר RGBA. אם במקום זאת, מפיק מציין שהמאגר שלו יהיה נגישות רק מהחומרה וכמרקם GLES, Gralloc יכול לעשות כל מה שמנהל התקן של GLES רוצה, כגון סדר BGRA, פריסות סחופות לא ליניאריות ותבניות צבע חלופיות. מתן אפשרות לחומרה להשתמש בפורמט המועדף עליה יכול לשפר את הביצועים.

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

את הידית המוחזרת על ידי Gralloc ניתן להעביר בין תהליכים דרך Binder.

חוצצים מוגנים

דגל השימוש של Gralloc GRALLOC_USAGE_PROTECTED מאפשר הצגת המאגר הגרפי רק דרך נתיב מוגן חומרה. מישורי שכבת-על אלו הם הדרך היחידה להציג תוכן DRM (לא ניתן לגשת למאגרים המוגנים ב-DRM על ידי SurfaceFlinger או מנהל ההתקן של OpenGL ES).

ניתן להציג וידאו מוגן DRM רק במישור שכבת-על. נגני וידאו התומכים בתוכן מוגן חייבים להיות מיושמים עם SurfaceView. תוכנה הפועלת על חומרה לא מוגנת אינה יכולה לקרוא או לכתוב את המאגר; נתיבים מוגנים בחומרה חייבים להופיע בשכבת העל של Hardware Composer (כלומר, סרטונים מוגנים נעלמים מהתצוגה אם Hardware Composer עובר להרכב OpenGL ES).

לפרטים על תוכן מוגן, ראה DRM .