ניהול framebuffer של לקוחות

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

ניהול Framebuffer במהלך מתגי רזולוציה

שינויים ברזולוציה מתרחשים עקב אחד משני התרחישים הבאים:

  • אירוע Hotplug , שיזם את Hardware Composer (HWC), המתרחש בעת החלפה מצג חיצוני אחד לצג חיצוני אחר בעל רזולוציית ברירת מחדל שונה.

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

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

    במהלך החלפת מצב תצוגה, נקודות האחיזה למאגרי מסגרות לקוח קיימים משוחררות על ידי SurfaceFlinger לפני קריאה ל- setActiveConfig או setActiveConfigWithConstraints .

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

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

המלצות לניהול framebuffer

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

כדי להימנע מכשלים קטסטרופליים בהקצאה, פעל לפי ההמלצות הבאות:

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

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

בדיקת framebuffer

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

  • לאירועי Hotplug, פשוט נתק וחבר מחדש שני צגים שונים ברזולוציות שונות.

  • עבור מתגי מצבים, השתמש במבחן ModeSwitchingTestActivity CTS Verifier כדי להפעיל מתג מצבים לבדיקת התנהגות זיכרון framebuffer. בדיקה זו יכולה לזהות חזותית בעיות שקשה לזהות באופן תכנותי.