ग्राफ़िक

Android Graphics HAL का आइकॉन

Android फ़्रेमवर्क, 2D और 3D ग्राफ़िक रेंडर करने के लिए कई एपीआई उपलब्ध कराता है. ये एपीआई, ग्राफ़िक ड्राइवर के मैन्युफ़ैक्चरर के लागू किए गए वर्शन के साथ इंटरैक्ट करते हैं. इसलिए, यह समझना ज़रूरी है कि ये एपीआई, हाई लेवल पर कैसे काम करते हैं. इस पेज पर, ग्राफ़िक हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल) के बारे में बताया गया है. ये ड्राइवर, इसी लेयर पर बने होते हैं. इस सेक्शन को पढ़ने से पहले, इन शब्दों के बारे में जान लें:

कैनवस (सामान्य शब्द), Canvas (एपीआई एलिमेंट)
कैनवस, ड्रॉ करने की एक ऐसी जगह होती है जो असली बिट को कंपोज़ करने की प्रोसेस को मैनेज करती है. यह बिटमैप या Surface ऑब्जेक्ट के मुकाबले होती है. Canvas क्लास में, बिटमैप, लाइन, सर्कल, रेक्टैंगल, टेक्स्ट वगैरह को कंप्यूटर पर ड्रॉ करने के स्टैंडर्ड तरीके मौजूद होते हैं. यह क्लास, बिटमैप या सरफेस से जुड़ी होती है. कैनवस, स्क्रीन पर 2D ऑब्जेक्ट ड्रॉ करने का सबसे आसान तरीका है. बेसिक क्लास, Canvas है.
ड्रॉ करने लायक
ड्रॉएबल, कंपाइल किया गया विज़ुअल रिसॉर्स होता है. इसका इस्तेमाल, बैकग्राउंड, टाइटल या स्क्रीन के किसी अन्य हिस्से के तौर पर किया जा सकता है. ड्रॉएबल को आम तौर पर, किसी अन्य यूज़र इंटरफ़ेस (यूआई) एलिमेंट में लोड किया जाता है. उदाहरण के लिए, बैकग्राउंड इमेज के तौर पर. ड्रॉएबल, इवेंट नहीं पा सकता. हालांकि, यह अन्य प्रॉपर्टी असाइन करता है. जैसे, स्टेट और शेड्यूलिंग. इससे, सबक्लास को चालू किया जा सकता है. जैसे, ऐनिमेशन ऑब्जेक्ट या इमेज लाइब्रेरी. कई ड्रॉएबल ऑब्जेक्ट, ड्रॉ करने लायक संसाधन फ़ाइलों से लोड किए जाते हैं. ये एक्सएमएल या बिट मैप फ़ाइलें होती हैं, जिनमें इमेज के बारे में जानकारी होती है. ड्रॉएबल रिसॉर्स की सबक्लास में कंपाइल किए जाते हैं android.graphics.drawable. ड्रॉएबल और अन्य रिसॉर्स के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन के रिसॉर्स की खास जानकारी देखें.
लेआउट रिसॉर्स
लेआउट रिसॉर्स, एक एक्सएमएल फ़ाइल होती है. इसमें, ऐक्टिविटी स्क्रीन के लेआउट के बारे में जानकारी होती है. ज़्यादा जानकारी के लिए, लेआउट रिसॉर्स देखें.
नाइन-पैच (9-पैच, NinePatch)
नाइन-पैच, साइज़ बदलने वाला बिटमैप रिसॉर्स होता है. इसका इस्तेमाल, डिवाइस पर बैकग्राउंड या अन्य इमेज के लिए किया जा सकता है. ज़्यादा जानकारी के लिए, नाइन-पैच देखें.
OpenGL ES
OpenGL ES, 2D और 3D ग्राफ़िक रेंडर करने के लिए, क्रॉस-प्लैटफ़ॉर्म एपीआई है. Android, हार्डवेयर-ऐक्सलरेटेड 3D रेंडरिंग के लिए, OpenGL ES लाइब्रेरी उपलब्ध कराता है. 2D रेंडरिंग के लिए, कैनवस एक आसान विकल्प है. OpenGL ES, Android Native Development Kit (NDK) में उपलब्ध है. `android.opengl ` और `javax.microedition.khronos.opengles ` पैकेज, OpenGL ES की सुविधाएं उपलब्ध कराते हैं.
सरफ़ेस (सामान्य शब्द), Surface (एपीआई एलिमेंट)
सरफ़ेस, मेमोरी के एक ब्लॉक को दिखाता है. इसे स्क्रीन पर कंपोज़ किया जाता है. सरफ़ेस में, ड्रॉ करने के लिए एक कैनवस होता है. साथ ही, लेयर ड्रॉ करने और Surface ऑब्जेक्ट का साइज़ बदलने के लिए, कई हेल्पर तरीके उपलब्ध होते हैं. SurfaceView क्लास के बजाय, सीधे Surface क्लास का इस्तेमाल करें.
सरफ़ेस व्यू (सामान्य शब्द), SurfaceView (एपीआई एलिमेंट)
सरफ़ेस व्यू, एक View ऑब्जेक्ट होता है. यह ड्रॉ करने के लिए, Surface ऑब्जेक्ट को रैप करता है. साथ ही, इसका साइज़ और फ़ॉर्मैट डाइनैमिक तरीके से तय करने के लिए, तरीके उपलब्ध कराता है. सरफ़ेस व्यू, रिसॉर्स-इंटेंसिव कार्रवाइयों के लिए, यूज़र इंटरफ़ेस (यूआई) थ्रेड से अलग ड्रॉ करने का तरीका उपलब्ध कराता है. जैसे, गेम या कैमरे के प्रीव्यू. हालांकि, इसके लिए ज़्यादा मेमोरी का इस्तेमाल किया जाता है. सरफ़ेस व्यू, कैनवस और OpenGL ES ग्राफ़िक, दोनों को सपोर्ट करता है. SurfaceView ऑब्जेक्ट के लिए, बेसिक क्लास SurfaceView है.
थीम
थीम, प्रॉपर्टी का एक सेट होता है. जैसे, टेक्स्ट का साइज़ और बैकग्राउंड का रंग. इसे, डिफ़ॉल्ट डिसप्ले सेटिंग तय करने के लिए बंडल किया जाता है. Android, कुछ स्टैंडर्ड थीम उपलब्ध कराता है. इनकी सूची R.style में दी गई है. साथ ही, इनके आगे Theme_ लिखा होता है.
व्यू (सामान्य शब्द), View (एपीआई एलिमेंट)
व्यू, स्क्रीन पर रेक्टैंगुलर एरिया ड्रॉ करता है. साथ ही, क्लिक, कीस्ट्रोक, और अन्य इंटरैक्शन इवेंट को मैनेज करता है. The View क्लास, ऐक्टिविटी या डायलॉग स्क्रीन के ज़्यादातर लेआउट कॉम्पोनेंट के लिए बेसिक क्लास होती है. जैसे, टेक्स्ट बॉक्स और विंडो. कोई View ऑब्जेक्ट, खुद को ड्रॉ करने के लिए, अपने पैरंट ऑब्जेक्ट से कॉल लेता है (देखें ViewGroup). साथ ही, यह अपने पैरंट ऑब्जेक्ट को, अपने पसंदीदा साइज़ और जगह के बारे में बताता है. ऐसा हो सकता है कि पैरंट ऑब्जेक्ट, इसकी पसंद के मुताबिक काम न करे. ज़्यादा जानकारी के लिए, View देखें.
व्यू ग्रुप (सामान्य शब्द), ViewGroup (एपीआई एलिमेंट)
व्यू ग्रुप, चाइल्ड व्यू के सेट को ग्रुप करता है. व्यू ग्रुप, यह तय करता है कि चाइल्ड व्यू कहां दिखेंगे और उनका साइज़ कितना होगा. साथ ही, यह हर व्यू को, ज़रूरत पड़ने पर खुद को ड्रॉ करने के लिए कॉल करता है. कुछ व्यू ग्रुप दिखते नहीं हैं और सिर्फ़ लेआउट के लिए होते हैं. वहीं, अन्य व्यू ग्रुप का अपना यूज़र इंटरफ़ेस (यूआई) होता है. जैसे, स्क्रोल करने वाला सूची बॉक्स. व्यू ग्रुप, android.widget पैकेज में होते हैं. हालांकि, ये ViewGroup क्लास को एक्सटेंड करते हैं.
व्यू हैरारकी (व्यू और व्यू ग्रुप के लेआउट का क्रम)
व्यू हैरारकी (व्यू और व्यू ग्रुप के लेआउट का क्रम), व्यू और व्यू ग्रुप ऑब्जेक्ट की एक व्यवस्था होती है. यह किसी ऐप्लिकेशन के हर कॉम्पोनेंट के लिए, यूज़र इंटरफ़ेस (यूआई) तय करती है. हैरारकी में, व्यू ग्रुप शामिल होते हैं. इनमें एक या उससे ज़्यादा चाइल्ड व्यू या व्यू ग्रुप होते हैं. डीबग करने और ऑप्टिमाइज़ करने के लिए, व्यू हैरारकी का विज़ुअल प्रतिनिधित्व पाया जा सकता है. इसके लिए, Android SDK के साथ दिए गए Hierarchy Viewer का इस्तेमाल करें.
Vulkan
Vulkan, हाई-परफ़ॉर्मेंस 3D ग्राफ़िक के लिए, कम ओवरहेड वाला क्रॉस-प्लैटफ़ॉर्म एपीआई है.
विजेट
विजेट, पूरी तरह से लागू की गई व्यू सबक्लास का एक सेट होता है. यह फ़ॉर्म एलिमेंट और अन्य यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट रेंडर करता है. जैसे, टेक्स्ट बॉक्स या पॉप-अप मेन्यू. विजेट पूरी तरह से लागू किया गया है. इसलिए, यह मेज़रमेंट, खुद को ड्रॉ करने, और स्क्रीन इवेंट के जवाब देने की प्रोसेस को मैनेज करता है. विजेट, android.widget पैकेज में होते हैं.
विंडो (सामान्य शब्द), Window (एपीआई एलिमेंट)
Android ऐप्लिकेशन में, विंडो, Window ऐब्स्ट्रैक्ट क्लास से लिया गया एक ऑब्जेक्ट होता है. यह सामान्य विंडो के एलिमेंट तय करता है. जैसे, लुक ऐंड फ़ील, टाइटल बार टेक्स्ट, और मेन्यू की जगह और कॉन्टेंट. डायलॉग और ऐक्टिविटी, Window ऑब्जेक्ट रेंडर करने के लिए, Window क्लास के लागू किए गए वर्शन का इस्तेमाल करते हैं. आपको अपने ऐप्लिकेशन में, Window क्लास को लागू करने या विंडो का इस्तेमाल करने की ज़रूरत नहीं है.

ऐप्लिकेशन डेवलपर, स्क्रीन पर तीन तरीकों से इमेज ड्रॉ करते हैं: कैनवस, OpenGL ES या Vulkan की मदद से.

Android के ग्राफ़िक कॉम्पोनेंट

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

इस डायग्राम में दिखाया गया है कि मुख्य कॉम्पोनेंट एक साथ कैसे काम करते हैं:

इमेज रेंडरिंग कॉम्पोनेंट

पहली इमेज. सरफ़ेस कैसे रेंडर की जाती हैं.

मुख्य कॉम्पोनेंट के बारे में, यहां बताया गया है.

इमेज स्ट्रीम प्रोड्यूसर

इमेज स्ट्रीम प्रोड्यूसर, कोई भी ऐसी चीज़ हो सकती है जो इस्तेमाल के लिए ग्राफ़िक बफ़र बनाती है. उदाहरण के लिए, OpenGL ES, Canvas 2D, और mediaserver वीडियो डिकोडर.

इमेज स्ट्रीम कंज्यूमर

इमेज स्ट्रीम का सबसे आम कंज्यूमर, SurfaceFlinger है. यह सिस्टम सेवा है, जो फ़िलहाल दिखने वाली सरफ़ेस का इस्तेमाल करती है और Window Manager से मिली जानकारी का इस्तेमाल करके, उन्हें डिसप्ले पर कंपोज़ करती है. SurfaceFlinger, सिर्फ़ ऐसी सेवा है जो डिसप्ले के कॉन्टेंट में बदलाव कर सकती है. SurfaceFlinger, OpenGL और Hardware Composer (HWC) का इस्तेमाल करके, सरफ़ेस के ग्रुप को कंपोज़ करता है.

अन्य OpenGL ES ऐप्लिकेशन भी, इमेज स्ट्रीम का इस्तेमाल कर सकते हैं. जैसे, कैमरा ऐप्लिकेशन, कैमरे के प्रीव्यू की इमेज स्ट्रीम का इस्तेमाल करता है. नॉन-जीएल ऐप्लिकेशन भी कंज्यूमर हो सकते हैं. उदाहरण के लिए, ImageReader क्लास.

हार्डवेयर कंपोज़र

डिसप्ले सबसिस्टम के लिए, हार्डवेयर ऐब्स्ट्रैक्शन. SurfaceFlinger, कंपोज़िशन से जुड़े कुछ काम, HWC को सौंप सकता है, ताकि OpenGL और जीपीयू पर पड़ने वाले लोड को कम किया जा सके. SurfaceFlinger, सिर्फ़ एक और OpenGL ES क्लाइंट के तौर पर काम करता है. इसलिए, जब SurfaceFlinger, एक या दो बफ़र को तीसरे बफ़र में कंपोज़ करता है, तो वह OpenGL ES का इस्तेमाल करता है. इससे, कंपोज़िशन में कम पावर लगती है. ऐसा इसलिए, क्योंकि जीपीयू को सभी कंप्यूटेशन नहीं करने पड़ते.

The Hardware Composer HAL, बाकी का काम करता है. यह Android के सभी ग्राफ़िक रेंडरिंग के लिए, मुख्य पॉइंट होता है. HWC को इवेंट सपोर्ट करना चाहिए. इनमें से एक इवेंट, VSync है. दूसरा इवेंट, प्लग-ऐंड-प्ले एचडीएमआई सपोर्ट के लिए हॉटप्लग है.

Gralloc

इमेज प्रोड्यूसर की ओर से अनुरोध की गई मेमोरी को ऐलोकेट करने के लिए, ग्राफ़िक मेमोरी ऐलोकेटर (Gralloc) की ज़रूरत होती है. ज़्यादा जानकारी के लिए, BufferQueue और Gralloc देखें.

डेटा फ़्लो

इस डायग्राम में, Android के ग्राफ़िक पाइपलाइन को दिखाया गया है:

ग्राफ़िक्स डेटा फ़्लो

दूसरी इमेज. Android के ज़रिए ग्राफ़िक डेटा का फ़्लो.

बाईं ओर मौजूद ऑब्जेक्ट, रेंडरर होते हैं. ये ग्राफ़िक बफ़र बनाते हैं. जैसे, होम स्क्रीन, स्टेटस बार, और सिस्टम यूज़र इंटरफ़ेस (यूआई). SurfaceFlinger, कंपोज़िटर है और HWC, कंपोज़र है.

BufferQueue

BufferQueue, Android के ग्राफ़िक कॉम्पोनेंट के बीच कनेक्शन उपलब्ध कराता है. ये दो क्यू होते हैं, जो प्रोड्यूसर से कंज्यूमर तक बफ़र के लगातार साइकल को मैनेज करते हैं. प्रोड्यूसर के बफ़र सौंपने के बाद, SurfaceFlinger, डिसप्ले पर हर चीज़ को कंपोज़ करने की ज़िम्मेदारी लेता है.

इस डायग्राम में, BufferQueue के कम्यूनिकेशन की प्रोसेस दिखाई गई है:

BufferQueue कम्यूनिकेशन प्रोसेस

तीसरी इमेज. BufferQueue के कम्यूनिकेशन की प्रोसेस.

BufferQueue में, इमेज स्ट्रीम प्रोड्यूसर और इमेज स्ट्रीम कंज्यूमर को एक साथ जोड़ने वाला लॉजिक शामिल होता है. इमेज प्रोड्यूसर के कुछ उदाहरण, कैमरा एचएएल या OpenGL ES गेम से जनरेट किए गए कैमरे के प्रीव्यू हैं. इमेज कंज्यूमर के कुछ उदाहरण, SurfaceFlinger या कोई अन्य ऐप्लिकेशन है, जो OpenGL ES स्ट्रीम दिखाता है. जैसे, कैमरा ऐप्लिकेशन, कैमरे का व्यूफ़ाइंडर दिखाता है.

BufferQueue, एक डेटा स्ट्रक्चर है. यह बफ़र पूल को क्यू के साथ जोड़ता है. साथ ही, प्रोसेस के बीच बफ़र पास करने के लिए, Binder इंटर-प्रोसेस कम्यूनिकेशन (आईपीसी) का इस्तेमाल करता है. प्रोड्यूसर इंटरफ़ेस या वह चीज़ जो ग्राफ़िक बफ़र जनरेट करने वाले किसी व्यक्ति को पास की जाती है, है IGraphicBufferProducer (SurfaceTexture का हिस्सा है). BufferQueue का इस्तेमाल अक्सर, किसी Surface पर रेंडर करने और GL Consumer के साथ इस्तेमाल करने के लिए किया जाता है. इसके अलावा, अन्य टास्क के लिए भी इसका इस्तेमाल किया जाता है.

BufferQueue, तीन अलग-अलग मोड में काम कर सकता है:

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

ज़्यादातर काम करने के लिए, SurfaceFlinger, सिर्फ़ एक और OpenGL ES क्लाइंट के तौर पर काम करता है. इसलिए, जब SurfaceFlinger, एक या दो बफ़र को तीसरे बफ़र में कंपोज़ करता है, तो वह OpenGL ES का इस्तेमाल करता है.

Hardware Composer HAL, बाकी का काम करता है. यह एचएएल, Android के सभी ग्राफ़िक रेंडरिंग के लिए, मुख्य पॉइंट के तौर पर काम करता है.