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

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

ניהול של מאגר פריימים במהלך מעבר בין רזולוציות

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

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

    במהלך אירוע hotplug, ה-handles של ה-framebuffer הישנים משוחררים כשמבטלים את ההקצאה של נתוני התצוגה הישנים.

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

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

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

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

המלצות לניהול של מאגר מסגרות

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

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

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

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

בדיקה של ניהול מאגר המסגרות

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

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

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