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