ב-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