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