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