ניהול של מאגר נתונים זמני של לקוח

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

ניהול מאגר נתונים זמני (framebuffer) במהלך חילופי רזולוציה

שינויים בפתרון יכולים לקרות כתוצאה מאחת מהסיבות הבאות שני תרחישים:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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