נעילה של מאגר נתונים זמני ללא אותות באמצעות 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, מותר להשתמש ב-latching של מאגרים ללא אות כשמתבצע עדכון של שכבה אחת בפריים, והעדכון כולל רק עדכון של מאגר ללא טרנזקציות סנכרון או שינויים בגיאומטריה. במצב הזה, הערך 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