ग्राफ़िक

Android ग्राफ़िक्स 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 नेटिव डेवलपमेंट किट (NDK) में उपलब्ध है. android.opengl और javax.microedition.khronos.opengles पैकेज, OpenGL ES की सुविधा देते हैं.
सरफ़ेस (सामान्य शब्द), Surface (एपीआई एलिमेंट)
सरफ़ेस, मेमोरी के एक ब्लॉक को दिखाता है. इसे स्क्रीन पर कंपोज़ किया जाता है. सरफ़ेस में ड्रॉइंग के लिए कैनवस होता है. साथ ही, यह लेयर बनाने और Surface ऑब्जेक्ट का साइज़ बदलने के लिए, कई हेल्पर तरीके उपलब्ध कराता है. Surface क्लास का सीधे तौर पर इस्तेमाल करने के बजाय, SurfaceView क्लास का इस्तेमाल करें.
सरफ़ेस व्यू (सामान्य शब्द), SurfaceView (एपीआई एलिमेंट)
सरफ़ेस व्यू, View ऑब्जेक्ट होता है. यह ड्रॉ करने के लिए, Surface ऑब्जेक्ट को रैप करता है. साथ ही, इसके साइज़ और फ़ॉर्मैट को डाइनैमिक तरीके से तय करने के लिए, तरीके दिखाता है. सरफ़ेस व्यू, यूज़र इंटरफ़ेस (यूआई) थ्रेड से अलग ड्रॉ करने का तरीका उपलब्ध कराता है. इसका इस्तेमाल, ज़्यादा संसाधन इस्तेमाल करने वाली कार्रवाइयों के लिए किया जाता है. जैसे, गेम या कैमरे के प्रीव्यू. हालांकि, इससे ज़्यादा मेमोरी का इस्तेमाल होता है. सरफ़ेस व्यू, कैनवस और OpenGL ES, दोनों तरह के ग्राफ़िक के साथ काम करता है. SurfaceView ऑब्जेक्ट के लिए बेस क्लास, SurfaceView है.
थीम
थीम, प्रॉपर्टी का एक सेट होता है. जैसे, टेक्स्ट का साइज़ और बैकग्राउंड का रंग. इन प्रॉपर्टी को एक साथ बंडल किया जाता है, ताकि डिसप्ले की अलग-अलग डिफ़ॉल्ट सेटिंग तय की जा सकें. Android, कुछ स्टैंडर्ड थीम उपलब्ध कराता है. इनकी सूची R.style में दी गई है और इनके पहले Theme_ लिखा है.
देखें (सामान्य शब्द), View (एपीआई एलिमेंट)
व्यू, स्क्रीन पर आयताकार जगह बनाता है. साथ ही, क्लिक, कीस्ट्रोक, और अन्य इंटरैक्शन इवेंट को मैनेज करता है. 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 ऐप्लिकेशन भी इमेज स्ट्रीम का इस्तेमाल कर सकते हैं. जैसे, कैमरा ऐप्लिकेशन, कैमरे की झलक वाली इमेज स्ट्रीम का इस्तेमाल करता है. GL से बाहर के ऐप्लिकेशन, उपभोक्ता भी हो सकते हैं. उदाहरण के लिए, ImageReader क्लास.

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

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

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

Gralloc

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

डेटा फ़्लो

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

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

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

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

BufferQueue

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

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

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

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

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

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

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

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

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

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