החל מאנדרואיד 13, מאגרי מסגרת חדשים, המשמשים במהלך הרכב הלקוח , מוקצים בכל פעם שרזולוציית התצוגה משתנה. הקצאה זו מבוצעת על ידי SurfaceFlinger במחזור הביטול הבא לאחר שינוי ברזולוציה.
ניהול Framebuffer במהלך מתגי רזולוציה
שינויים ברזולוציה מתרחשים עקב אחד משני התרחישים הבאים:
אירוע Hotplug , שיזם את Hardware Composer (HWC), המתרחש בעת החלפה מצג חיצוני אחד לצג חיצוני אחר בעל רזולוציית ברירת מחדל שונה.
במהלך אירוע Hotplug, נקודות האחיזה ל-framebuffers הישנות משתחררות כאשר נתוני התצוגה הישנים מובטלים.
מתג מצב תצוגה שיזם SurfaceFlinger, המתרחש כאשר המשתמש משנה את הרזולוציה עם הגדרות המשתמש , או אפליקציה משנה את הרזולוציה עם
preferredDisplayModeId
.במהלך החלפת מצב תצוגה, נקודות האחיזה למאגרי מסגרות לקוח קיימים משוחררות על ידי SurfaceFlinger לפני קריאה ל-
setActiveConfig
אוsetActiveConfigWithConstraints
.
כדי למנוע בעיות קטסטרופליות, כגון פיצול זיכרון, במכשירים שאינם שומרים מספיק זיכרון למאגרי המסגרת הישנים והחדשים, זה קריטי ש-HWC יפסיק להשתמש במאגרי המסגרת הישנים ותשחרר כל ידיות למאגרי המסגרת הללו, כפי שמוצג במקרים הבאים:
לאירועי Hotplug, מיד לפני התקשרות
onHotplug
.עבור החלפת מצבים, מיד לאחר הקריאה ל-
setActiveConfig
אוsetActiveConfigWithConstraints
.
שחרור הידיות מאפשר ביטול מלא של זיכרון ה-framebuffer לפני הקצאת מאגרי מסגרת חדשים ש-SurfaceFlinger מבצע במהלך מחזור הפסילה הבא.
המלצות לניהול framebuffer
אם HWC לא משחרר ידיות למאגרים ישנים בזמן, הקצאת ה-framebuffer החדשה מתרחשת לפני הקצאת ה-framebuffer הישנה. זה יכול לגרום לבעיות קטסטרופליות כאשר ההקצאה החדשה נכשלת עקב פיצול או בעיות אחרות. גרוע מכך, אם HWC לא משחרר את הידיות הללו כלל, עלולה להתרחש דליפת זיכרון.
כדי להימנע מכשלים קטסטרופליים בהקצאה, פעל לפי ההמלצות הבאות:
אם HWC צריך להמשיך להשתמש במאגרי המסגרת הישנים של הלקוח עד שסופקו מאגרי המסגרת החדשים של הלקוח, אז זה קריטי לשמור מספיק זיכרון עבור מאגרי המסגרת הישנים והחדשים, ואולי להפעיל אלגוריתמי איחוי על שטח הזיכרון של ה-framebuffer.
הקצו מאגר זיכרון ייעודי למאגרי המסגרת הנפרד משאר זיכרון המאגר הגרפי. זה חשוב מכיוון שבין הקצאה והקצאה מחדש של מאגרי המסגרת, תהליך של צד שלישי יכול לנסות להקצות זיכרון גרפי. אם אותו מאגר זיכרון גרפי נמצא בשימוש על ידי ה-framebuffer ואם הזיכרון הגרפי מלא, תהליך הצד השלישי יכול לכבוש את הזיכרון הגרפי שהוקצה קודם לכן על ידי framebuffer, ובכך להשאיר זיכרון לא מספיק עבור ההקצאה מחדש של ה-framebuffer או, אולי לפצל את שטח הזיכרון .
בדיקת framebuffer
מומלץ ליצרני ציוד מקורי לבדוק ניהול תקין של זיכרון מסגרת מאיץ לקוח על פני מתגי רזולוציה עבור המכשיר שלהם, המתואר כדלקמן:
לאירועי Hotplug, פשוט נתק וחבר מחדש שני צגים שונים ברזולוציות שונות.
עבור מתגי מצבים, השתמש במבחן
ModeSwitchingTestActivity
CTS Verifier כדי להפעיל מתג מצבים לבדיקת התנהגות זיכרון framebuffer. בדיקה זו יכולה לזהות חזותית בעיות שקשה לזהות באופן תכנותי.