SurfaceFlinger और WindowManager

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

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

SurfaceFlinger, बफ़र को दो तरीकों से स्वीकार कर सकता है: BufferQueue और SurfaceControl के ज़रिए या ASurfaceControl के ज़रिए.

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

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

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

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

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

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

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

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

WindowManager

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

प्री-रोटेशन

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

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