נעילה של מאגר נתונים זמני ללא אותות באמצעות 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. מעקב אחרי מאגר נתונים לא מאותת ב-Perfetto