נעילה של מאגר ללא אות עם 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. Trace of a latched unsignaled buffer in Perfetto