हर डेवलपर को इन विषयों के बारे में पता होना चाहिए: सर्फ़ेस, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger, और Vulkan.
इस पेज पर, Android सिस्टम-लेवल ग्राफ़िक्स आर्किटेक्चर के ज़रूरी एलिमेंट के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि ऐप्लिकेशन फ़्रेमवर्क और मल्टीमीडिया सिस्टम इनका इस्तेमाल कैसे करते हैं. इसमें इस बात पर फ़ोकस किया जाता है कि ग्राफ़िकल डेटा के बफ़र, सिस्टम में कैसे मूव करते हैं. अगर आपको कभी यह जानना था कि SurfaceView और TextureView इस तरह से क्यों काम करते हैं या सर्फ़ेस और EGLSurface कैसे इंटरैक्ट करते हैं, तो आप सही जगह पर हैं.
यह मान लिया जाता है कि आपको Android डिवाइसों और ऐप्लिकेशन डेवलपमेंट के बारे में कुछ जानकारी है. आपको ऐप्लिकेशन फ़्रेमवर्क के बारे में ज़्यादा जानकारी की ज़रूरत नहीं है. इसमें बहुत कम एपीआई कॉल के बारे में बताया गया है. हालांकि, यह कॉन्टेंट अन्य सार्वजनिक दस्तावेज़ों से मेल नहीं खाता. इस दस्तावेज़ का मकसद, आउटपुट के लिए फ़्रेम रेंडर करने में शामिल मुख्य इवेंट के बारे में जानकारी देना है. इससे आपको ऐप्लिकेशन डिज़ाइन करते समय, सोच-समझकर फ़ैसले लेने में मदद मिलेगी. इसके लिए, यह दस्तावेज़ बॉटम-अप अप्रोच का इस्तेमाल करता है. इसमें यह बताया गया है कि यूज़र इंटरफ़ेस (यूआई) क्लास कैसे काम करती हैं, न कि उनका इस्तेमाल कैसे किया जा सकता है.
इस सेक्शन में कई पेज शामिल हैं. इनमें बैकग्राउंड मटीरियल से लेकर एचएएल की जानकारी और इस्तेमाल के उदाहरणों तक, हर चीज़ के बारे में बताया गया है. इसमें Android ग्राफ़िक्स बफ़र के बारे में बताया गया है. साथ ही, कंपोज़िशन और डिसप्ले मैकेनिज़्म के बारे में जानकारी दी गई है. इसके बाद, कंपोज़िटर को डेटा उपलब्ध कराने वाले उच्च-स्तरीय मैकेनिज़्म के बारे में बताया गया है. हमारा सुझाव है कि आप इन पेजों को इसी क्रम में पढ़ें. ऐसा न करें कि आपको जो विषय दिलचस्प लगे उसे ही पढ़ें.
लो-लेवल कॉम्पोनेंट
- BufferQueue और gralloc. BufferQueue, ग्राफ़िकल डेटा के बफ़र जनरेट करने वाले कॉम्पोनेंट (प्रोड्यूसर) को ऐसे कॉम्पोनेंट से कनेक्ट करता है जो डेटा को डिसप्ले करने या आगे की प्रोसेसिंग के लिए स्वीकार करता है (कंज्यूमर). बफ़र का बंटवारा, gralloc मेमोरी ऐलोकेटर के ज़रिए किया जाता है. इसे वेंडर के हिसाब से एचएएल इंटरफ़ेस के ज़रिए लागू किया जाता है.
- SurfaceFlinger, Hardware Composer, और वर्चुअल डिसप्ले. SurfaceFlinger, कई सोर्स से डेटा के बफ़र स्वीकार करता है, उन्हें कंपोज़ करता है, और डिसप्ले पर भेजता है. हार्डवेयर कंपोज़र एचएएल (एचडब्ल्यूसी) यह तय करता है कि उपलब्ध हार्डवेयर के साथ बफ़र को कंपोज़ करने का सबसे असरदार तरीका क्या है. साथ ही, वर्चुअल डिसप्ले कंपोज़ किए गए आउटपुट को सिस्टम में उपलब्ध कराते हैं. जैसे, स्क्रीन रिकॉर्ड करना या स्क्रीन को नेटवर्क पर भेजना.
- Surface, canvas, और SurfaceHolder. कोई सर्फ़ेस, बफ़र क्यू बनाता है. इसका इस्तेमाल अक्सर SurfaceFlinger करता है. किसी सरफेस पर रेंडर करते समय, नतीजा एक बफ़र में सेव हो जाता है. इस बफ़र को उपभोक्ता को भेज दिया जाता है. Canvas API, सॉफ़्टवेयर को लागू करने की सुविधा देते हैं. साथ ही, ये हार्डवेयर-ऐक्सलरेशन की सुविधा के साथ, सीधे तौर पर किसी सर्फ़ेस पर ड्रॉ करने की सुविधा देते हैं. यह OpenGL ES का लो-लेवल विकल्प है. व्यू से जुड़ी किसी भी चीज़ में SurfaceHolder शामिल होता है. इसके एपीआई, साइज़ और फ़ॉर्मैट जैसे सर्फ़ेस पैरामीटर को पाने और सेट करने की सुविधा देते हैं.
- EGLSurface और OpenGL ES. OpenGL ES (GLES), ग्राफ़िक रेंडरिंग एपीआई को तय करता है. इसे EGL के साथ इस्तेमाल करने के लिए डिज़ाइन किया गया है. EGL एक ऐसी लाइब्रेरी है जो ऑपरेटिंग सिस्टम के ज़रिए विंडो बना सकती है और उन्हें ऐक्सेस कर सकती है. टेक्सचर वाले पॉलीगॉन बनाने के लिए, GLES कॉल का इस्तेमाल करें. रेंडरिंग को स्क्रीन पर दिखाने के लिए, EGL कॉल का इस्तेमाल करें. इस पेज पर, ANativeWindow के बारे में भी बताया गया है. यह Java Surface क्लास का C/C++ वर्शन है. इसका इस्तेमाल, नेटिव कोड से EGL विंडो सरफेस बनाने के लिए किया जाता है.
- Vulkan. Vulkan, ज़्यादा परफ़ॉर्मेंस वाले 3D ग्राफ़िक के लिए, कम ओवरहेड वाला क्रॉस-प्लैटफ़ॉर्म एपीआई है. OpenGL ES की तरह, Vulkan भी ऐप्लिकेशन में अच्छी क्वालिटी के रीयल-टाइम ग्राफ़िक बनाने के लिए टूल उपलब्ध कराता है. Vulkan के फ़ायदों में, सीपीयू के ओवरहेड को कम करना और SPIR-V बाइनरी इंटरमीडिएट भाषा के लिए सहायता शामिल है.
ज़्यादा बेहतर कॉम्पोनेंट
- SurfaceView और GLSurfaceView. SurfaceView, एक Surface और एक View को जोड़ता है. SurfaceView के व्यू कॉम्पोनेंट, SurfaceFlinger (ऐप्लिकेशन नहीं) से कंपोज़ किए जाते हैं. इससे, अलग थ्रेड/प्रोसेस से रेंडरिंग की जा सकती है. साथ ही, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) रेंडरिंग से अलग किया जा सकता है. GLSurfaceView, EGL कॉन्टेक्स्ट, इंटरथ्रेड कम्यूनिकेशन, और ऐक्टिविटी लाइफ़साइकल के साथ इंटरैक्शन को मैनेज करने के लिए हेल्पर क्लास उपलब्ध कराता है. हालांकि, GLES का इस्तेमाल करने के लिए इसकी ज़रूरत नहीं होती.
- SurfaceTexture. SurfaceTexture, Surface और GLES टेक्सचर को मिलाकर एक BufferQueue बनाता है. आपका ऐप्लिकेशन इसका इस्तेमाल करता है. जब कोई प्रोड्यूसर नया बफ़र कतार में लगाता है, तो यह आपके ऐप्लिकेशन को सूचना देता है. इसके बाद, आपका ऐप्लिकेशन पहले से मौजूद बफ़र को रिलीज़ करता है, कतार से नया बफ़र हासिल करता है, और EGL कॉल करता है, ताकि बफ़र को GLES के लिए बाहरी टेक्सचर के तौर पर उपलब्ध कराया जा सके. Android 7.0 में, सुरक्षित टेक्सचर वीडियो चलाने की सुविधा जोड़ी गई है. इससे, सुरक्षित वीडियो कॉन्टेंट को जीपीयू की मदद से प्रोसेस किया जा सकता है.
- TextureView. TextureView, व्यू को SurfaceTexture के साथ जोड़ता है. TextureView, SurfaceTexture को रैप करता है. साथ ही, यह कॉलबैक का जवाब देने और नए बफ़र पाने की ज़िम्मेदारी लेता है. ड्रॉ करते समय, TextureView सबसे हाल ही में मिले बफ़र के कॉन्टेंट का इस्तेमाल अपने डेटा सोर्स के तौर पर करता है. साथ ही, व्यू की स्थिति के हिसाब से रेंडर करता है. व्यू कंपोज़िशन हमेशा GLES के साथ की जाती है. इसका मतलब है कि कॉन्टेंट में अपडेट करने से, व्यू के अन्य एलिमेंट भी फिर से रेंडर हो सकते हैं.