נעילת חיץ לא מאומנת עם AutoSingleLayer

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

לפני אנדרואיד 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. עקבות של חיץ לא מסומן ננעל בפרפטו