लेयर और डिसप्ले, दो प्राइमिटिव हैं. ये कॉम्पोज़िशन के काम और डिसप्ले हार्डवेयर के साथ इंटरैक्शन को दिखाते हैं.
परतें
लेयर, कंपोज़िशन की सबसे अहम यूनिट होती है. लेयर, सर्फ़ेस और SurfaceControl
के किसी इंस्टेंस का कॉम्बिनेशन होती है. हर लेयर में प्रॉपर्टी का एक सेट होता है, जो
यह तय करता है कि यह अन्य लेयर के साथ कैसे इंटरैक्ट करती है. लेयर प्रॉपर्टी के बारे में नीचे दी गई टेबल में बताया गया है.
प्रॉपर्टी | ब्यौरा |
---|---|
पोज़िशनल | इससे यह तय होता है कि लेयर, डिसप्ले पर कहां दिखेगी. इसमें यह जानकारी शामिल होती है कि लेयर के किनारों की पोज़िशन क्या है और वह दूसरी लेयर के मुकाबले Z ऑर्डर में कहां है. साथ ही, यह भी बताया जाता है कि लेयर को दूसरी लेयर के आगे या पीछे रखना है या नहीं. |
कॉन्टेंट | इससे यह तय होता है कि लेयर पर दिखाए गए कॉन्टेंट को, पोज़िशन वाली प्रॉपर्टी से तय किए गए सीमाओं के अंदर कैसे दिखाया जाना चाहिए. इसमें, काट-छांट (लेयर की सीमाओं को भरने के लिए कॉन्टेंट के किसी हिस्से को बड़ा करने के लिए) और बदलाव (घुमाया गया या फ़्लिप किया गया कॉन्टेंट दिखाने के लिए) जैसी जानकारी शामिल होती है. |
कंपोज़िशन | इससे यह तय होता है कि लेयर को दूसरी लेयर के साथ कैसे कंपोज किया जाना चाहिए. इसमें अल्फा कंपोज़िंग के लिए, ब्लेंडिंग मोड और लेयर-वाइड अल्फा वैल्यू जैसी जानकारी शामिल होती है. |
ऑप्टिमाइज़ेशन | यह लेयर को सही तरीके से कंपोज करने के लिए ज़रूरी जानकारी नहीं देता है. हालांकि, हार्डवेयर कंपोजर (एचडब्ल्यूसी) डिवाइस, कॉम्पोज़ करने के तरीके को ऑप्टिमाइज़ करने के लिए इसका इस्तेमाल कर सकता है. इसमें लेयर के दिखने वाले हिस्से और पिछले फ़्रेम के बाद, लेयर के किस हिस्से में बदलाव हुआ है जैसी जानकारी शामिल होती है. |
डिसप्ले
डिसप्ले, कंपोज़िशन की एक और अहम इकाई है. किसी सिस्टम में एक से ज़्यादा डिसप्ले हो सकते हैं. साथ ही, सिस्टम के सामान्य कामकाज के दौरान डिसप्ले जोड़े या हटाए जा सकते हैं. डिसप्ले, एचडब्ल्यूसी या फ़्रेमवर्क के अनुरोध पर जोड़े/हटाए जाते हैं. जब कोई बाहरी डिसप्ले डिवाइस से कनेक्ट या डिसकनेक्ट किया जाता है, तो एचडब्ल्यूसी डिवाइस, डिसप्ले को जोड़ने या हटाने का अनुरोध करता है. इसे हॉटप्लगिंग कहा जाता है. क्लाइंट, वर्चुअल डिसप्ले का अनुरोध करते हैं. इनका कॉन्टेंट, किसी फ़िज़िकल डिसप्ले के बजाय ऑफ़-स्क्रीन बफ़र में रेंडर किया जाता है.
वर्चुअल डिसप्ले
SurfaceFlinger, इंटरनल डिसप्ले (फ़ोन या टैबलेट में पहले से मौजूद), बाहरी डिसप्ले (जैसे, एचडीएमआई के ज़रिए कनेक्ट किया गया टीवी) के साथ-साथ एक या उससे ज़्यादा वर्चुअल डिसप्ले के साथ काम करता है. ये डिसप्ले, सिस्टम में कॉम्पोज़िट आउटपुट उपलब्ध कराते हैं. वर्चुअल डिसप्ले का इस्तेमाल, स्क्रीन को रिकॉर्ड करने या नेटवर्क पर स्क्रीन भेजने के लिए किया जा सकता है. वर्चुअल डिसप्ले के लिए जनरेट किए गए फ़्रेम, BufferQueue में लिखे जाते हैं.
वर्चुअल डिसप्ले, मुख्य डिसप्ले (लेयर स्टैक) के लेयर का सेट शेयर कर सकते हैं या उनका अपना सेट हो सकता है. वर्चुअल डिसप्ले के लिए कोई VSYNC नहीं होता, इसलिए इंटरनल डिसप्ले के लिए VSYNC, सभी डिसप्ले के लिए कॉम्पोज़िशन को ट्रिगर करता है.
जिन एचडब्ल्यूसी लागू करने की सुविधाएं काम करती हैं उन पर, वर्चुअल डिसप्ले को OpenGL ES (GLES), एचडब्ल्यूसी या GLES और एचडब्ल्यूसी, दोनों के साथ कंपोज किया जा सकता है. काम न करने वाले विज्ञापनों पर, वर्चुअल डिसप्ले को हमेशा जीएलईएस का इस्तेमाल करके कंपोज़ किया जाता है.
केस स्टडी: screenrecord
screenrecord
निर्देश की मदद से उपयोगकर्ता, स्क्रीन पर दिखने वाली हर चीज़ को डिस्क पर .mp4
फ़ाइल के तौर पर रिकॉर्ड कर सकता है. इसे लागू करने के लिए, सिस्टम को SurfaceFlinger से कॉम्पोज़ किए गए फ़्रेम मिलते हैं. इसके बाद, सिस्टम उन्हें वीडियो एन्कोडर में लिखता है और फिर एन्कोड किए गए वीडियो डेटा को फ़ाइल में लिखता है. वीडियो कोडेक को एक अलग प्रोसेस (mediaserver
) से मैनेज किया जाता है. इसलिए, बड़े ग्राफ़िक बफ़र को सिस्टम में एक से दूसरी जगह जाना पड़ता है. इसे और ज़्यादा चुनौतीपूर्ण बनाने के लिए, ज़्यादा से ज़्यादा रिज़ॉल्यूशन में 60 एफ़पीएस (फ़्रेम प्रति सेकंड) पर वीडियो रिकॉर्ड करें. इस काम को बेहतर तरीके से करने के लिए बफ़र सूची का इस्तेमाल किया जाता है.
MediaCodec
क्लास की मदद से, ऐप्लिकेशन को बफ़र में या किसी प्लैटफ़ॉर्म के ज़रिए डेटा को रॉ बाइट के तौर पर उपलब्ध कराया जा सकता है. जब screenrecord
किसी वीडियो एन्कोडर के ऐक्सेस का अनुरोध करता है, तो mediaserver
प्रोसेस एक BufferQueue बनाती है और खुद को उपभोक्ता साइड से कनेक्ट करती है. इसके बाद, प्रोड्यूसर साइड को एक प्लैटफ़ॉर्म के तौर पर screenrecord
को वापस भेजती है.
इसके बाद, screenrecord
यूटिलिटी SurfaceFlinger से एक वर्चुअल डिसप्ले बनाने के लिए कहती है, जो मुख्य डिसप्ले की स्क्रीन जैसा ही होता है (यानी इसमें सभी लेयर एक जैसी होती हैं). इसके बाद, वह आउटपुट को mediaserver
प्रोसेस से आने वाले प्लैटफ़ॉर्म पर भेजने के लिए भेजती है. इस मामले में, SurfaceFlinger उपभोक्ता के बजाय
बफ़र का प्रोड्यूसर है.
कॉन्फ़िगरेशन पूरा होने के बाद, एन्क्रिप्ट (सुरक्षित) किया गया डेटा दिखने पर screenrecord
ट्रिगर होता है. ऐप्लिकेशन के ड्रॉ होने पर, उनके बफ़र SurfaceFlinger पर जाते हैं. यहां उन्हें एक बफ़र में कॉम्पोज़ किया जाता है. इस बफ़र को mediaserver
प्रोसेस में सीधे वीडियो एन्कोडर पर भेजा जाता है. screenrecord
प्रोसेस में कभी भी पूरे फ़्रेम नहीं दिखते. अंदरूनी तौर पर, mediaserver
प्रोसेस में बफ़र को एक जगह से दूसरी जगह ले जाने का अपना तरीका होता है. साथ ही, यह हैंडल के ज़रिए डेटा भी पास करती है, जिससे ओवरहेड कम हो जाता है.
केस स्टडी: कई साइज़ के डिसप्ले बनाएं
WindowManager, SurfaceFlinger को एक ऐसी लेयर बनाने के लिए कह सकता है जिसके लिए SurfaceFlinger, बफ़र क्यू उपभोक्ता के तौर पर काम करता है. SurfaceFlinger से वर्चुअल डिसप्ले बनाने के लिए भी कहा जा सकता है. इसके लिए, SurfaceFlinger, BufferQueue प्रोड्यूसर के तौर पर काम करता है.
अगर किसी वर्चुअल डिसप्ले को विज़िबल लेयर से कनेक्ट किया जाता है, तो एक क्लोज़्ड लूप बन जाता है. इसमें, कॉम्पोज़ की गई स्क्रीन किसी विंडो में दिखती है. वह विंडो अब कॉम्पोज़ किए गए आउटपुट का हिस्सा है. इसलिए, अगली बार रीफ़्रेश करने पर, विंडो में कॉम्पोज़ की गई इमेज के साथ-साथ विंडो का कॉन्टेंट भी दिखता है. इसे काम करते हुए देखने के लिए, सेटिंग में जाकर डेवलपर के लिए सेटिंग और टूल चालू करें. इसके बाद, सेकंडरी डिसप्ले को सिम्युलेट करें को चुनें और कोई विंडो चालू करें. सेकंडरी डिसप्ले को ऐक्शन में देखने के लिए, screenrecord
का इस्तेमाल करके डिसप्ले को चालू करने की प्रोसेस को कैप्चर करें. इसके बाद, उसे फ़्रेम के हिसाब से चलाएं.