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 में, लॉच किए गए बिना सिग्नल वाले बफ़र का ट्रेस