ב-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. Trace of a latched unsignaled buffer in Perfetto