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