ב-Android 13 מוצגת הגדרה חדשה בשם AutoSingleLayer
לנעילת מאגרי נתונים שלא אותתו. ההגדרה הזו מאפשרת ל-SurfaceFlinger לנעול מאגר לא מסומן כשמתבצע עדכון רק בשכבה אחת.
הוא לא חל על מקרים שמתרחשים בשכבות שונות, למשל שינויים בגיאומטריה או טרנזקציות של סנכרון.
בעבר, הדגל debug.sf.latch_unsignaled
בפרויקט Android Open Source (פרויקט קוד פתוח של Android, AOSP) אפשר ל-SurfaceFlinger לצרף את כל המאגרים שלא אותתו, ללא קשר לתרחיש השימוש. הפעלת ההגדרה הזו עלולה לגרום לתופעות לוואי לא רצויות, למשל, שיבוש של עסקאות סנכרון והקפאה של התצוגה כולה בזמן ההמתנה למאגרי נתונים חלקיים.
במצב AutoSingleLayer
, SurfaceFlinger מעדכן רק מאגר של משטח יחיד בפריים. במצב הזה, משחקים ואפליקציות אחרות במסך מלא יכולים להפיק תועלת משימוש במאגרי נתונים זמניים לא מסומנים ומהפחתת הבעיות באפליקציה, בלי להיות מושפעים מהקפאת התצוגה.
הגדרות של מצב AutoSingleLayer
ב-Android 13, AutoSingleLayer
הוא מצב ברירת המחדל של התכונה 'מאגר לא מסומן של תפס'. המצב הזה נשלט על ידי מאפיין המערכת debug.sf.auto_latch_unsignaled
.
SurfaceFlinger קורא את LatchUnsignaledConfig
בזמן האתחול. ההגדרות האפשריות הן:
LatchUnsignaledConfig::AutoSingleLayer
במצב ברירת המחדל הזה של AOSP, SurfaceFlinger מאפשר הצמדה של מאגרי מידע לא מסומנים כששכבה אחת מתעדכנת בפריים. העדכון צריך לכלול רק עדכון של אזור חיץ, ללא עסקאות סנכרון או שינויים בגיאומטריה. כברירת מחדל, במצב הזה
debug.sf.auto_latch_unsignaled
מוגדר כ-true
.LatchUnsignaledConfig::Disabled
במצב הזה, מושבתת ההתנהגות של נעילה ללא סימון, והנעילה מתבצעת רק בעסקאות מסומנות. המצב הזה משבית גם את מצב
AutoSingleLayer
. כדי להגדיר את המצב הזה, צריך להגדיר אתdebug.sf.latch_unsignaled
ואתdebug.sf.auto_latch_unsignaled
לערךfalse
.LatchUnsignaledConfig::Always
במצב הזה, SurfaceFlinger נועל את כל המאגרים שלא אותתו. כדי להגדיר את המצב הזה, מגדירים את
debug.sf.latch_unsignaled
לערךtrue
.
Test AutoSingleLayer
כדי לבדוק אם מאגר ננעל ללא סימון, מחפשים את העקבות הבאות מ-SurfaceFlinger ב-Perfetto:
איור 1. Trace of a latched unsignaled buffer in Perfetto