SurfaceFlinger और WindowManager

SurfaceFlinger में बफ़र को सेव किया जाता है, बफ़र को कंपोज़ किया जाता है, और डिसप्ले. WindowManager, SurfaceFlinger को बफ़र और विंडो के मेटाडेटा की जानकारी देता है. SurfaceFlinger इस जानकारी का इस्तेमाल, डिसप्ले पर कॉम्पोज़िट किए गए सर्वफ़ेस के लिए करता है.

सरफ़ेसफ्लिंगर

SurfaceFlinger में बफ़र को दो तरीकों से स्वीकार किया जा सकता है: बफ़र सूची का इस्तेमाल करके और SurfaceControl या ASurfaceControl के ज़रिए.

SurfaceFlinger, BufferQueue और SurfaceControl की मदद से बफ़र स्वीकार करता है. जब कोई ऐप्लिकेशन फ़ोरग्राउंड में आता है, तो वह WindowManager से बफ़र का अनुरोध करता है. इसके बाद WindowManager, SurfaceFlinger में है. लेयर, सर्फ़ेस और SurfaceControl का कॉम्बिनेशन होती है. इसमें BufferQueue और डिसप्ले फ़्रेम जैसा लेयर मेटाडेटा होता है. SurfaceFlinger लेयर बनाता है और उसे WindowManager को भेजता है. इसके बाद, WindowManager, ऐप्लिकेशन को सर्वर भेजता है. हालांकि, स्क्रीन पर ऐप्लिकेशन के दिखने के तरीके में बदलाव करने के लिए, SurfaceControl को अपने पास रखता है.

Android 10 में ASurfaceControl जोड़ा गया है, जो कि एक और जिस तरीके से SurfaceFlinger बफ़र को स्वीकार कर सके. ASurfaceControl, किसी सर्वफ़ेस और SurfaceControl को एक लेन-देन पैकेज में जोड़ता है. इसे SurfaceFlinger पर भेजा जाता है. ASurfaceControl, किसी लेयर से जुड़ा होता है. ऐप्लिकेशन, ASurfaceTransactions की मदद से इस लेयर को अपडेट करते हैं. इसके बाद, ऐप्लिकेशन को ASurfaceTransactionStats को पास करने वाले कॉलबैक से ASurfaceलेन-देन करने पर इसमें लैच टाइम, अधिग्रहण का समय वगैरह जैसी जानकारी शामिल होती है.

नीचे दी गई टेबल में ASurfaceControl और इसके जुड़े हुए कॉम्पोनेंट.

कॉम्पोनेंट ब्यौरा
ASurfaceControl SurfaceControl को रैप करता है और किसी ऐप्लिकेशन को डिसप्ले पर लेयर से जुड़ी SurfaceControl बनाने की सुविधा देता है.

इसे ANativeWindow के चाइल्ड के तौर पर या किसी अन्य ASurfaceControl के चाइल्ड के तौर पर बनाया जा सकता है.
ASurfaceTransaction यह ट्रांज़ैक्शन को रैप करता है, ताकि क्लाइंट लेयर की जानकारी देने वाली प्रॉपर्टी में बदलाव कर सके. जैसे, ज्यामिति. साथ ही, अपडेट किए गए बफ़र को SurfaceFlinger को भेजता है.
ASurfaceTransactionStats दिखाए गए लेन-देन के बारे में जानकारी भेजता है, जैसे लैच टाइम, अधिग्रहण समय, और पिछली रिलीज़ फ़ेंस को पहले से रजिस्टर कॉलबैक.

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

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

SurfaceFlinger, दिखने वाली लेयर के लिए सभी बफ़र इकट्ठा करने के बाद, हार्डवेयर कंपोज़र (एचडब्ल्यूसी) से पूछता है कि कंपोज़िशन कैसे किया जाना चाहिए. अगर HWC, लेयर कॉम्पोज़िशन टाइप को क्लाइंट कॉम्पोज़िशन के तौर पर मार्क करता है, तो SurfaceFlinger उन लेयर को कॉम्पोज़ करता है. इसके बाद, SurfaceFlinger आउटपुट बफ़र को HW पर पास करती है.

WindowManager

WindowManager, window ऑब्जेक्ट को कंट्रोल करता है. ये ऑब्जेक्ट, view ऑब्जेक्ट के कंटेनर होते हैं. विंडो ऑब्जेक्ट का बैक अप, हमेशा सतह के ऑब्जेक्ट से लिया जाता है. WindowManager, विंडो के लाइफ़साइकल, इनपुट और फ़ोकस इवेंट, स्क्रीन ओरिएंटेशन, ट्रांज़िशन, ऐनिमेशन, पोज़िशन, ट्रांसफ़ॉर्म, z-क्रम, और कई अन्य पहलुओं को मैनेज करता है. WindowManager सभी विंडो मेटाडेटा को SurfaceFlinger में जोड़ें, ताकि SurfaceFlinger इस डेटा का इस्तेमाल इन कामों के लिए कर सके संयुक्त सतहें दिखाई देती हैं.

प्री-रोटेट

कई हार्डवेयर ओवरले, घुमाने की सुविधा के साथ काम नहीं करते. भले ही, वे काम करते हों, लेकिन प्रोसेसिंग पावर का इस्तेमाल होता है. इसका समाधान यह है कि SurfaceFlinger तक पहुंचने से पहले, बफ़र को बदल दिया जाए. Android पर क्वेरी संकेत की सुविधा काम करती है ANativeWindow में (NATIVE_WINDOW_TRANSFORM_HINT) को बफ़र पर लागू किए जाने वाले संभावित रूपांतरण को SurfaceFlinger में है. GL ड्राइवर इस हिंट का इस्तेमाल, बफ़र के SurfaceFlinger में पहुंचने से पहले, उसे पहले से बदलने के लिए कर सकते हैं. इससे बफ़र के पहुंचने पर, उसे सही तरीके से बदला जा सकता है.

उदाहरण के लिए, 90 डिग्री घुमाने का संकेत मिलने पर, बफ़र में मैट्रिक जनरेट करें और उसे लागू करें, ताकि वह पेज के आखिर में न जाए. बैटरी बचाने के लिए, पहले से ही रोटेशन की सुविधा चालू करें. ज़्यादा जानकारी के लिए, ANativeWindow देखें इंटरफ़ेस को system/core/include/system/window.h में परिभाषित किया गया है.