AutoSingleLayer के साथ, बिना सिग्नल वाले बफ़र को लॉक करना

Android 13 में, बिना सिग्नल वाले बफ़र को लॉक करने के लिए, AutoSingleLayer नाम का नया कॉन्फ़िगरेशन जोड़ा गया है. इस कॉन्फ़िगरेशन की मदद से, SurfaceFlinger ऐसे बफ़र को लैच कर सकता है जिसके लिए सिग्नल नहीं मिला है. ऐसा सिर्फ़ तब होता है, जब एक लेयर अपडेट हो रही हो. यह उन मामलों में नहीं होता जो लेयर के बीच होते हैं. जैसे, ज्यामिति में बदलाव या सिंक ट्रांज़ैक्शन.

Android 13 से पहले, AOSP में मौजूद debug.sf.latch_unsignaled फ़्लैग की मदद से 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

यह देखने के लिए कि बफ़र को बिना किसी सूचना के लॉक किया गया है या नहीं, Perfetto में SurfaceFlinger से मिले इन ट्रेस को देखें:

बिना सिग्नल वाले बफ़र का ट्रेस

पहली इमेज. Perfetto में, बिना सिग्नल वाले बफ़र का निशान