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