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

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

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

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

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

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

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

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

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

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

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

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

विंडोमैनेजर

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

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

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

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