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

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

इससे पहले, Android Open Source Project (AOSP) में मौजूद debug.sf.latch_unsignaled फ़्लैग की मदद से, SurfaceFlinger सभी अनसिग्नल बफ़र को लैच कर सकता था. भले ही, इस्तेमाल का तरीका कुछ भी हो. इस कॉन्फ़िगरेशन को चालू करने पर, कुछ समस्याएं हो सकती हैं. जैसे, सिंक किए गए लेन-देन में रुकावट आना और बफ़र पूरा न होने पर पूरी डिसप्ले फ़्रीज़ हो जाना.

AutoSingleLayer मोड में, SurfaceFlinger एक फ़्रेम में सिर्फ़ एक सरफेस के बफ़र को अपडेट करता है. इस मोड की मदद से, गेम और अन्य फ़ुलस्क्रीन ऐप्लिकेशन को फ़ायदा मिलता है. जैसे, बिना सिग्नल वाले बफ़र को लैच करना और ऐप्लिकेशन के रुक-रुक कर चलने की समस्या को कम करना. साथ ही, डिसप्ले फ़्रीज़ होने की समस्या से भी इन पर कोई असर नहीं पड़ता.

AutoSingleLayer मोड की सेटिंग

Android 13 के लिए, लैच अनसिग्नल बफ़र सुविधा का डिफ़ॉल्ट मोड AutoSingleLayer है. इस मोड को सिस्टम प्रॉपर्टी 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

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

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

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