लेयर और डिसप्ले

लेयर और डिसप्ले, दो प्राइमिटिव हैं. ये कॉम्पोज़िशन के काम और डिसप्ले हार्डवेयर के साथ इंटरैक्शन को दिखाते हैं.

परतें

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

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

डिसप्ले

डिसप्ले, कॉम्पोज़िशन की एक और अहम यूनिट है. सिस्टम यह कर सकता है जिसमें कई डिसप्ले हों और सिस्टम की सामान्य कार्रवाइयों के दौरान, डिसप्ले जोड़े या हटाए जा सकते हैं. डिसप्ले, एचडब्ल्यूसी या फ़्रेमवर्क के अनुरोध पर जोड़े/हटाए जाते हैं. जब कोई बाहरी डिसप्ले डिवाइस से कनेक्ट या डिसकनेक्ट किया जाता है, तो एचडब्ल्यूसी डिवाइस, डिसप्ले को जोड़ने या हटाने का अनुरोध करता है. इसे हॉटप्लगिंग कहा जाता है. क्लाइंट ऐसे वर्चुअल डिसप्ले का अनुरोध करते हैं जिनका कॉन्टेंट जिन्हें डिसप्ले के बजाय ऑफ़-स्क्रीन बफ़र में रेंडर किया जाता है.

वर्चुअल डिसप्ले

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

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

एचडब्ल्यूसी तरीकों को लागू करने पर, वर्चुअल तरीके से डिसप्ले को OpenGL ES (जीएलईएस), एचडब्ल्यूसी या जीएलईएस और एचडब्ल्यूसी दोनों के साथ मिलाया जा सकता है. लागू नहीं होने पर, वर्चुअल डिसप्ले हमेशा इसका इस्तेमाल करके कंपोज़िट किए जाते हैं जीएलएस.

केस स्टडी: स्क्रीन रिकॉर्डर

screenrecord कमांड की मदद से, उपयोगकर्ता स्क्रीन पर दिखने वाली हर चीज़ को डिस्क पर .mp4 फ़ाइल के तौर पर रिकॉर्ड कर सकता है. इसे लागू करने के लिए, सिस्टम को SurfaceFlinger से कॉम्पोज़ किए गए फ़्रेम मिलते हैं. इसके बाद, सिस्टम उन्हें वीडियो एन्कोडर में लिखता है और फिर एन्कोड किए गए वीडियो डेटा को फ़ाइल में लिखता है. वीडियो कोडेक को एक अलग प्रोसेस से मैनेज किया जाता है (mediaserver), इसलिए बड़े ग्राफ़िक बफ़र को सिस्टम. इसे और ज़्यादा चुनौतीपूर्ण बनाने के लिए, ज़्यादा से ज़्यादा रिज़ॉल्यूशन में 60 एफ़पीएस (फ़्रेम प्रति सेकंड) वाला वीडियो रिकॉर्ड करें. इस काम को बेहतर तरीके से करने के लिए बफ़र सूची का इस्तेमाल किया जाता है.

MediaCodec क्लास की मदद से, ऐप्लिकेशन को बफ़र में रॉ बाइट के तौर पर या किसी प्लैटफ़ॉर्म के ज़रिए डेटा उपलब्ध कराया जा सकता है. जब screenrecord किसी वीडियो का ऐक्सेस मांगता है एन्कोडर, mediaserver प्रोसेस बफ़र सूची बनाती है, जो कि एक नई एन्कोडर से कनेक्ट होता है और फिर उत्पादक पक्ष को वापस भेज देता है. screenrecord को सतह के तौर पर.

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

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

केस स्टडी: कई साइज़ के डिसप्ले बनाएं

WindowManager, SurfaceFlinger से कोई लेयर बनाने के लिए कह सकता है. इसके लिए, SurfaceFlinger, BufferQueue कंज्यूमर के तौर पर काम करता है. SurfaceFlinger से वर्चुअल डिसप्ले बनाने के लिए भी कहा जा सकता है. इसके लिए, SurfaceFlinger, BufferQueue प्रोड्यूसर के तौर पर काम करता है.

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