נעילה של מאגר ללא אות עם AutoSingleLayer

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