BufferQueue ו- Gralloc

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

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

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

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

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

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

מעקב אחר BufferQueue עם Systrace

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

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

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

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

גרלוק

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

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

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

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

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

מאגרים מוגנים

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

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

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