सरफेसफ्लिंगर और विंडोमैनेजर

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

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

सर्फेसफ्लिंगर बफ़र्स को दो तरह से स्वीकार कर सकता है: बफ़रक्यू और सर्फेसकंट्रोल के माध्यम से, या एसुरफेसकंट्रोल के माध्यम से।

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

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

निम्न तालिका में ASurfaceControl और इससे जुड़े घटकों के बारे में अधिक विवरण शामिल हैं।

अवयव विवरण
सतह नियंत्रण सर्फेसकंट्रोल को लपेटता है और एक ऐप को सर्फेसकंट्रोल बनाने में सक्षम बनाता है जो डिस्प्ले पर परतों के अनुरूप होता है।

AnativeWindow के बच्चे के रूप में या किसी अन्य ASurfaceControl के बच्चे के रूप में बनाया जा सकता है।
एसर्फेस ट्रांजैक्शन क्लाइंट को एक परत के वर्णनात्मक गुणों, जैसे ज्यामिति को संपादित करने में सक्षम करने के लिए लेनदेन को लपेटता है, और अद्यतन बफ़र्स को SurfaceFlinger को भेजता है।
AsurfaceTransactionStats प्रस्तुत किए गए लेन-देन के बारे में जानकारी भेजता है, जैसे कि लैच टाइम, अधिग्रहण समय, और पिछली रिलीज बाड़, एक ऐप को पूर्व-पंजीकृत कॉलबैक के माध्यम से भेजता है।

हालाँकि ऐप्स किसी भी समय बफ़र्स सबमिट कर सकते हैं, सरफेसफ्लिंगर केवल डिस्प्ले रिफ्रेश के बीच बफ़र्स को स्वीकार करने के लिए जागता है, जो डिवाइस के आधार पर भिन्न हो सकता है। यह मेमोरी के उपयोग को कम करता है और स्क्रीन पर दिखाई देने वाले फटने से बचाता है, जो डिस्प्ले के बीच-रिफ्रेश को अपडेट करते समय हो सकता है।

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

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

विंडो प्रबंधक

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

पूर्व-रोटेशन

कई हार्डवेयर ओवरले रोटेशन का समर्थन नहीं करते हैं (और यदि वे करते भी हैं, तो इसकी प्रोसेसिंग पावर खर्च होती है); इसका समाधान बफर को सर्फेसफ्लिंगर तक पहुंचने से पहले बदलना है। एंड्रॉइड सर्फेसफ्लिंगर द्वारा बफर पर लागू होने वाले सबसे संभावित परिवर्तन का प्रतिनिधित्व करने के लिए ANativeWindow में एक क्वेरी संकेत ( NATIVE_WINDOW_TRANSFORM_HINT ) का समर्थन करता है। जीएल ड्राइवर इस संकेत का उपयोग बफर को सर्फेसफ्लिंगर तक पहुंचने से पहले पूर्व-रूपांतरित करने के लिए कर सकते हैं ताकि जब बफर आए, तो यह सही ढंग से रूपांतरित हो।

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