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

ב-Android 13 נוספה הגדרה חדשה בשם AutoSingleLayer לנעילת מאגרי נתונים שלא אותתו עליהם. ההגדרה הזו מאפשרת ל-SurfaceFlinger לנעול מאגר לא מסומן כשמתבצע עדכון של שכבה אחת בלבד. הוא לא חל על מקרים שמתרחשים בשכבות שונות, למשל שינויים בגיאומטריה או טרנזקציות סנכרון.

בעבר, הדגל debug.sf.latch_unsignaled בפרויקט Android Open Source (פרויקט קוד פתוח של Android,‏ AOSP) אפשר ל-SurfaceFlinger לנעול את כל המאגרים שלא אותתו, ללא קשר לתרחיש השימוש. הפעלת ההגדרה הזו עלולה לגרום לתופעות לוואי לא רצויות, למשל, שיבוש של עסקאות סנכרון והקפאה של התצוגה כולה בזמן ההמתנה למאגרי נתונים זמניים לא מלאים.

במצב AutoSingleLayer, ‏ SurfaceFlinger מעדכן רק מאגר של משטח יחיד בפריים. במצב הזה, משחקים ואפליקציות אחרות במסך מלא יכולים להפיק תועלת מנעילת מאגרי נתונים זמניים לא מסומנים ומצמצום הבעיות באפליקציה, בלי להיות מושפעים מהקפאת התצוגה.

הגדרות של מצב AutoSingleLayer

ב-Android 13, ‏ AutoSingleLayer הוא מצב ברירת המחדל של התכונה latch unsignaled buffer. המצב הזה נקבע על ידי מאפיין המערכת 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