ग्राफ़िक

Android Graphics HAL का आइकॉन

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

कैनवस (सामान्य शब्द), Canvas (एपीआई एलिमेंट)
कैनवस एक ड्रॉइंग प्लैटफ़ॉर्म है. यह बिटमैप या Surface ऑब्जेक्ट के हिसाब से, असली बिट को कॉम्पोज़ करता है. Canvas में बिटमैप, लाइनों, सर्कल, रेक्टैंगल, टेक्स्ट वगैरह की स्टैंडर्ड कंप्यूटर ड्रॉइंग के लिए तरीके होते हैं. साथ ही, यह बिटमैप या सतह से जुड़ा होता है. कैनवस, स्क्रीन पर 2D ऑब्जेक्ट बनाने का सबसे आसान तरीका है. बेस क्लास Canvas है.
drawable
ड्रॉबल, कंपाइल किया गया विज़ुअल रिसॉर्स होता है. इसका इस्तेमाल, स्क्रीन के बैकग्राउंड, टाइटल या किसी दूसरे हिस्से के तौर पर किया जा सकता है. आम तौर पर, ड्रॉबल किसी दूसरे यूज़र इंटरफ़ेस एलिमेंट में लोड किया जाता है. उदाहरण के लिए, बैकग्राउंड इमेज के तौर पर. ड्रॉआउट, इवेंट पाने की सुविधा नहीं देता. हालांकि, ऐनिमेशन ऑब्जेक्ट या इमेज लाइब्रेरी जैसी सबक्लास चालू करने के लिए, वह राज्य और शेड्यूलिंग जैसी कई अन्य प्रॉपर्टी असाइन करता है. ड्रॉ किए जा सकने वाले कई ऑब्जेक्ट, ड्रॉ किए जा सकने वाले रिसॉर्स फ़ाइलों से लोड किए जाते हैं — ये ऐसी एक्सएमएल या बिटमैप फ़ाइलें होती हैं जिनमें इमेज के बारे में जानकारी होती है. ड्रॉ किए जा सकने वाले संसाधनों को 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 ऑब्जेक्ट का साइज़ बदलने के लिए, कई तरह के सहायक तरीके उपलब्ध होते हैं. सीधे Surface क्लास के बजाय, SurfaceView क्लास का इस्तेमाल करें.
सर्फ़ेस व्यू (सामान्य शब्द), SurfaceView (एपीआई एलिमेंट)
सरफ़ेस व्यू एक View ऑब्जेक्ट है, जो ड्रॉइंग के लिए Surface ऑब्जेक्ट को रैप करता है. साथ ही, अपने साइज़ और फ़ॉर्मैट को डाइनैमिक तौर पर तय करने के तरीके दिखाता है. गेम या कैमरे की झलक जैसे ज़्यादा संसाधनों वाले ऑपरेशन के लिए, यूज़र इंटरफ़ेस (यूआई) थ्रेड के बजाय, अलग से ड्रॉ करने का विकल्प, सरफ़ेस व्यू से मिलता है. हालांकि, इसके लिए ज़्यादा मेमोरी का इस्तेमाल किया जाता है. सरफ़ेस व्यू, कैनवस और OpenGL ES ग्राफ़िक, दोनों के साथ काम करता है. SurfaceView ऑब्जेक्ट की बेस क्लास, SurfaceView है.
theme
थीम, प्रॉपर्टी का एक सेट होती है. जैसे, टेक्स्ट का साइज़ और बैकग्राउंड का रंग. ये प्रॉपर्टी, डिसप्ले की अलग-अलग डिफ़ॉल्ट सेटिंग तय करने के लिए एक साथ बंडल की जाती हैं. Android कुछ स्टैंडर्ड थीम उपलब्ध कराता है. ये थीम, R.style में दी गई हैं और इनके आगे Theme_ लिखा होता है.
व्यू (सामान्य शब्द), View (एपीआई एलिमेंट)
व्यू, स्क्रीन पर एक आयताकार क्षेत्र बनाता है और क्लिक, कीस्ट्रोक, और अन्य इंटरैक्शन इवेंट को मैनेज करता है. View क्लास, किसी गतिविधि या डायलॉग स्क्रीन के ज़्यादातर लेआउट कॉम्पोनेंट के लिए, मुख्य क्लास होती है. जैसे, टेक्स्ट बॉक्स और विंडो. View ऑब्जेक्ट को अपने पैरंट ऑब्जेक्ट (ViewGroup देखें) से कॉल मिलते हैं, ताकि वह खुद को ड्रॉ कर सके. साथ ही, अपने पैरंट ऑब्जेक्ट को अपने पसंदीदा साइज़ और जगह के बारे में बताता है. हालांकि, हो सकता है कि पैरंट ऑब्जेक्ट इस जानकारी का इस्तेमाल न करे. ज़्यादा जानकारी के लिए, View देखें.
व्यू ग्रुप (सामान्य शब्द), ViewGroup (एपीआई एलिमेंट)
व्यू ग्रुप, चाइल्ड व्यू के सेट को ग्रुप में बांटता है. यह तय करना कि चाइल्ड व्यू कहां और कितने बड़े होंगे, यह ViewGroup की ज़िम्मेदारी होती है. साथ ही, ज़रूरत पड़ने पर, हर व्यू को खुद को ड्रॉ करने के लिए कॉल करना भी ViewGroup की ज़िम्मेदारी होती है. कुछ व्यू ग्रुप, सिर्फ़ लेआउट के लिए होते हैं और वे दिखते नहीं हैं. वहीं, कुछ में एक खास यूज़र इंटरफ़ेस (यूआई) होता है, जैसे कि स्क्रोलिंग सूची बॉक्स. व्यू ग्रुप, widget पैकेज में होते हैं, लेकिन ViewGroup क्लास को बड़ा करते हैं.
व्यू हैरारकी (व्यू और व्यू ग्रुप के लेआउट का क्रम)
व्यू हैरारकी, व्यू और व्यू ग्रुप ऑब्जेक्ट का एक क्रम होता है. इससे किसी ऐप्लिकेशन के हर कॉम्पोनेंट के लिए यूज़र इंटरफ़ेस तय होता है. हैरारकी में ऐसे व्यू ग्रुप होते हैं जिनमें एक या एक से ज़्यादा चाइल्ड व्यू या व्यू ग्रुप होते हैं. Android SDK के साथ दिए गए हैरारकी व्यूअर का इस्तेमाल करके, डिबग करने और ऑप्टिमाइज़ करने के लिए, व्यू हैरारकी की विज़ुअल इमेज देखी जा सकती है.
Vulkan
Vulkan, बेहतर परफ़ॉर्मेंस वाले 3D ग्राफ़िक के लिए, कम ओवरहेड वाला क्रॉस-प्लैटफ़ॉर्म एपीआई है.
विजेट
विजेट, पूरी तरह से लागू किए गए व्यू सबक्लास के सेट में से एक है. यह फ़ॉर्म एलिमेंट और अन्य यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट को रेंडर करता है. जैसे, टेक्स्ट बॉक्स या पॉप-अप मेन्यू. विजेट पूरी तरह से लागू होने के बाद, यह खुद को मेज़र करने, ड्रॉ करने, और स्क्रीन इवेंट का जवाब देने का काम करता है. विजेट, android.widget पैकेज में मौजूद हैं.
window (सामान्य शब्द), Window (एपीआई एलिमेंट)
Android ऐप्लिकेशन में, विंडो एक ऑब्जेक्ट होता है. यह Window ऐब्स्ट्रैक्ट क्लास से लिया जाता है. यह क्लास, सामान्य विंडो के एलिमेंट के बारे में बताती है. जैसे, लुक और फ़ील, टाइटल बार का टेक्स्ट, और मेन्यू की जगह और कॉन्टेंट. डायलॉग और गतिविधियां, Window ऑब्जेक्ट को रेंडर करने के लिए, Window क्लास के लागू होने का इस्तेमाल करती हैं. आपको अपने ऐप्लिकेशन में Window क्लास को लागू करने या विंडो का इस्तेमाल करने की ज़रूरत नहीं है.

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

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

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

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

इमेज रेंडर करने वाले कॉम्पोनेंट

पहली इमेज. प्लैटफ़ॉर्म को रेंडर करने का तरीका.

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

इमेज स्ट्रीम बनाने वाले

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

इमेज स्ट्रीम के उपभोक्ता

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

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

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

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

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

Gralloc

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

डेटा फ़्लो

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

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

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

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

BufferQueue

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

BufferQueue के साथ कम्यूनिकेशन की प्रोसेस के बारे में जानने के लिए, यह डायग्राम देखें.

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

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

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

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

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

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

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

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

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

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