ב-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, מותר להשתמש ב-latching של מאגרים ללא אות כשמתבצע עדכון של שכבה אחת בפריים, והעדכון כולל רק עדכון של מאגר ללא טרנזקציות סנכרון או שינויים בגיאומטריה. במצב הזה, הערך
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