
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
(एपीआई एलिमेंट)android.widget
पैकेज में होते हैं. हालांकि, ये ViewGroup
क्लास को बढ़ाते हैं.
android.widget
पैकेज में मौजूद हैं. Window
(एपीआई एलिमेंट)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 में, इमेज स्ट्रीम प्रोड्यूसर और इमेज स्ट्रीम कंज्यूमर को एक साथ जोड़ने का लॉजिक होता है. इमेज बनाने वाले कुछ उदाहरणों में, कैमरा HAL या OpenGL ES गेम से बनाई गई कैमरा प्रीव्यू इमेज शामिल हैं. इमेज का इस्तेमाल करने वाले कुछ उदाहरण यहां दिए गए हैं: SurfaceFlinger या ऐसा कोई दूसरा ऐप्लिकेशन जो OpenGL ES स्ट्रीम दिखाता है. जैसे, कैमरा ऐप्लिकेशन, कैमरा व्यूफ़ाइंडर दिखाता है.
BufferQueue एक डेटा स्ट्रक्चर है. यह बफ़र पूल को एक कतार के साथ जोड़ता है. साथ ही, यह प्रोसेस के बीच बफ़र पास करने के लिए, बाइंडर इंटर-प्रोसेस कम्यूनिकेशन (आईपीसी) का इस्तेमाल करता है. प्रड्यूसर इंटरफ़ेस या ग्राफ़िक बफ़र जनरेट करने वाले व्यक्ति को पास की जाने वाली चीज़, IGraphicBufferProducer
(SurfaceTexture
का हिस्सा) होती है. BufferQueue का इस्तेमाल अक्सर, Surface पर रेंडर करने और GLConsumer के साथ इस्तेमाल करने के लिए किया जाता है. इसके अलावा, इसका इस्तेमाल अन्य कामों के लिए भी किया जाता है.
BufferQueue तीन अलग-अलग मोड में काम कर सकता है:
ज़्यादातर काम करने के लिए, SurfaceFlinger सिर्फ़ एक और OpenGL ES क्लाइंट के तौर पर काम करता है. इसलिए, जब SurfaceFlinger एक या दो बफ़र को तीसरे बफ़र में कंपोज़िट कर रहा होता है, तब वह OpenGL ES का इस्तेमाल करता है.
बाकी काम, Hardware Composer HAL करता है. यह HAL, Android के सभी ग्राफ़िक रेंडरिंग के लिए मुख्य पॉइंट के तौर पर काम करता है.