ग्राफ़िक

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

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

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

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

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

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

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

मुख्य कॉम्पोनेंट के बारे में नीचे दिए गए सेक्शन में बताया गया है.

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

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

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

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

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

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

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

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

Gralloc

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

डेटा फ़्लो

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

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

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

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

BufferQueue

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

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

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

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

BufferQueue में लॉजिक होता है, जो इमेज स्ट्रीम के प्रोड्यूसर और इमेज स्ट्रीम के कंज़्यूमर को एक साथ जोड़ता है. इमेज जनरेट करने वाले कुछ उदाहरणों में, कैमरा एचएएल या 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 का इस्तेमाल कर रहा है.

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