נעילה של מאגר ללא אות עם AutoSingleLayer

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

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

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

הגדרות של מצב AutoSingleLayer

ב-Android 13, הערך AutoSingleLayer הוא מצב ברירת המחדל של מאגר הנתונים הזמני ללא אות. המצב הזה נשלט על ידי מאפיין המערכת debug.sf.auto_latch_unsignaled.

SurfaceFlinger קורא את LatchUnsignaledConfig בזמן האתחול. אלה ההגדרות האפשריות:

  • LatchUnsignaledConfig::AutoSingleLayer

    במצב ברירת המחדל הזה של AOSP, מותר להצמיד מאגרים ללא אות כשמתעדכן שכבה אחת בפריים, והעדכון כולל רק עדכון של מאגר ללא טרנזקציות סנכרון או שינויים בגיאומטריה. במצב הזה, debug.sf.auto_latch_unsignaled מוגדר כברירת מחדל כ-true.

  • LatchUnsignaledConfig::Disabled

    במצב הזה, ההתנהגות של מנעול ללא אות מושבתת, והמנעול נועל רק טרנזקציות עם אות. המצב הזה משבית גם את המצב AutoSingleLayer. כדי להגדיר את המצב הזה, מגדירים את debug.sf.latch_unsignaled ואת debug.sf.auto_latch_unsignaled לערך false.

  • LatchUnsignaledConfig::Always

    במצב הזה, כל המאגרים מופעלים ללא אות. כדי להגדיר את המצב הזה, צריך להגדיר את הערך של debug.sf.latch_unsignaled ל-true.

בדיקה AutoSingleLayer

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

מעקב אחר מאגר לא מאותת עם נעילה

איור 1. מעקב אחרי מאגר נתונים לא מאותת ב-Perfetto