בערימה הגרפית, מטמון מאגר פר-שכבתי יושב בין Composer HAL ו- SurfaceFlinger כדי להפחית את התקורה הקשורה לשליחת מתארי קבצים דרך IPC. לפני אנדרואיד 14, מטמון המאגר הזה לא נוקה כאשר GraphicBufferProducer
מתנתק מ-SurfaceFlinger GraphicBufferConsumer
, כגון כאשר MediaCodec מנותק מ-SurfaceView. החל מאנדרואיד 14, אתה יכול לנקות בכוח את מטמון המאגר הזה כדי להפחית את צריכת הזיכרון הגרפי.
בחר מתוך אחת משתי האפשרויות הבאות:
- עבור מכשירים המופעלים עם אנדרואיד 14 ומעלה, עליך ליישם את Composer HAL API גרסה 3.2 החדשה. אפשרות זו מופעלת כברירת מחדל וחוסכת את מירב הזיכרון. מכשירים המשדרגים ל-14 ואילך יכולים גם להשתמש באפשרות זו כדי להשיג יתרונות מלאים בזיכרון.
- עבור מכשירים המשדרגים לאנדרואיד 14 שעבורם אינך רוצה ליישם את Composer HAL 3.2 API, תוכל להפעיל את האפשרות התואמת לאחור. אפשרות זו חוסכת זיכרון כמעט כמו האפשרות הקודמת.
שני הסעיפים הבאים מסבירים כיצד ליישם כל אפשרות.
הטמע את ה-API של Composer HAL 3.2
כדי להשיג יתרונות מלאים של זיכרון חיץ גרפי, עליך:
- עדכן את הטמעת Composer HAL שלך לגרסה 3.2.
- עבד את
LayerCommand::bufferSlotsToClear
על ידי טיהור ערכי מטמון מאגר המצוינים על ידי מספרי המשבצות שנמצאו ברשימה.
ממשקי ה-API של Composer HAL 3.2 הקשורים לזיכרון חיץ גרפי, כולל LayerCommand:bufferSlotsToClear
, נמצאים ב- LayerCommand.aidl-
.
הפעל את האפשרות התואמת לאחור
אפשרות הפחתת הזיכרון התואמת לאחור מחליפה מאגר אמיתי בחריץ המטמון במאגר מציין מיקום של 1x1, וכתוצאה מכך חיסכון בזיכרון עבור כל החריצים המטוהרים, למעט חריץ המאגר הפעיל הנוכחי. כדי להשיג יתרונות חלקיים של חיסכון בזיכרון, הפעל את האפשרות התואמת לאחור על ידי הגדרת sysprop של surface_flinger.clear_slots_with_set_layer_buffer
ל- true
. ה-sysprop הזה נמצא בקובץ property_contexts
.
הגדרת sysprop זה דורשת מימוש Composer HAL שלך לטפל בצורה נכונה במספר פקודות setLayerBuffer
עבור אותה שכבה במחזור נוכחי יחיד.
להפעלת האפשרות התואמת לאחור יש את ההשפעות הבאות:
עבור AIDL HALs: SurfaceFlinger שולח מופעי
LayerCommand
מרובים עבור שכבה אחת, כל אחד עםBufferCommand
יחיד. כלBufferCommand
מכיל ידית מאגר מציין מיקום 1x1 ומספר חריץ עבור חריץ מאגר המטמון שיש לנקות.עבור HIDL HALs: SurfaceFlinger שולח מספר פקודות
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
. פקודות אלה מכילות ידית מאגר מציין מיקום 1x1 ומספר חריץ עבור חריץ מאגר המטמון שיש לנקות.
האפשרות התואמת לאחור עלולה לגרום ל-Composer HAL לקרוס במכשירים מסוימים. ייתכן שתוכל לשנות את ה-Composer HAL שלך כדי לפתור בעיה זו. הקוד השולט בהתנהגות זו נמצא כאן:
בדיקת צריכת זיכרון מטמון מאגר גרפי
בדיקות לא יכולות לאמת אם חריצי המטמון מטוהרים על ידי יישומי HAL. עם זאת, אתה יכול להשתמש בכלי ניפוי הבאגים שלך כדי לפקח על השימוש במאגר גרפי. בזמן שאתה עוקב, אתה צריך לשים לב שיש פחות שגיאות מחוץ לזיכרון בתרחישים שבהם מספר סרטונים שונים מופסקים ומופעלים ברצף מהיר ב-YouTube.
בדיקות VTS זמינות המוודאות שהטמעת HAL מסוגלת פונקציונלית לקבל את קריאות ה-API החדשות (HAL גרסה 3.2+) או מספר פקודות setLayerBuffer
עבור המימוש התואם לאחור. עם זאת, אין לראות בכך בדיקה מספקת לפונקציונליות תקינה, מכיוון שחלק מהמכשירים עוברים בדיקות VTS אלו, אך נכשלים במהלך מקרי שימוש בעולם האמיתי.
לבדיקות VTS חדשות, נווט אל הקישורים הבאים:
תואם HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
תואם AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear