ग्राफ़िक्स आर्किटेक्चर

सर्फ़ेस, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger, और Vulkan के बारे में हर डेवलपर को क्या पता होना चाहिए.

इस पेज पर, Android सिस्टम-लेवल के ग्राफ़िक्स आर्किटेक्चर के ज़रूरी एलिमेंट के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि ऐप्लिकेशन फ़्रेमवर्क और मल्टीमीडिया सिस्टम इनका इस्तेमाल कैसे करते हैं. इसमें यह पता लगाया जाता है कि ग्राफ़िकल डेटा के बफ़र, सिस्टम में कैसे चलते हैं. अगर आपको कभी यह जानना है कि SurfaceView और TextureView, इस तरह से क्यों काम करते हैं या सतहें और EGLSurface कैसे इंटरैक्ट करते हैं, तो आप सही जगह पर हैं.

यह माना जाता है कि आप Android डिवाइसों और ऐप्लिकेशन डेवलपमेंट के बारे में कुछ जानते हैं. इसके लिए, आपको ऐप्लिकेशन फ़्रेमवर्क के बारे में ज़्यादा जानकारी की ज़रूरत नहीं है. साथ ही, इसमें बहुत कम एपीआई कॉल के बारे में बताया गया है. हालांकि, यह कॉन्टेंट, दूसरे सार्वजनिक दस्तावेज़ों से अलग होता है. इसका मकसद, आउटपुट के लिए फ़्रेम को रेंडर करने से जुड़ी अहम घटनाओं के बारे में जानकारी देना है. इससे, आपको ऐप्लिकेशन डिज़ाइन करते समय सही फ़ैसले लेने में मदद मिलेगी. ऐसा करने के लिए, हम सबसे नीचे से ऊपर की ओर काम करते हैं. साथ ही, हम यूआई क्लास के इस्तेमाल के बजाय, उनके काम करने के तरीके के बारे में बताते हैं.

इस सेक्शन में कई पेज शामिल हैं. इनमें बैकग्राउंड मैटीरियल से लेकर, एचएएल की जानकारी और इस्तेमाल के उदाहरणों तक की जानकारी शामिल है. यह Android ग्राफ़िक्स बफ़र के बारे में जानकारी देने के साथ शुरू होती है. इसके बाद, कॉम्पोज़िशन और डिसप्ले के तरीके के बारे में बताती है. इसके बाद, कॉम्पोज़िटर को डेटा देने वाले बेहतर तरीके के बारे में बताती है. हमारा सुझाव है कि आप नीचे दिए गए क्रम में पेज पढ़ें. ऐसा करने से, आपको अपने हिसाब से विषय चुनने में मदद मिलेगी.

लो-लेवल कॉम्पोनेंट

  • BufferQueue और gralloc. BufferQueue, ग्राफ़िकल डेटा के बफ़र जनरेट करने वाले प्रोड्यूसर को, डिसप्ले या आगे की प्रोसेसिंग के लिए डेटा स्वीकार करने वाले कंज्यूमर से कनेक्ट करता है. बफ़र के लिए मेमोरी का ऐलोकेशन, gralloc मेमोरी ऐलोकेटर की मदद से किया जाता है. इसे वेंडर के हिसाब से बनाए गए एचएएल इंटरफ़ेस की मदद से लागू किया जाता है.
  • SurfaceFlinger, हार्डवेयर कंपोजर, और वर्चुअल डिसप्ले. SurfaceFlinger, कई सोर्स से डेटा के बफ़र स्वीकार करता है, उन्हें कॉम्पोज़ करता है, और डिसप्ले पर भेजता है. हार्डवेयर कंपोजर एचएएल (एचडब्ल्यूसी), उपलब्ध हार्डवेयर के साथ बफ़र को कंपोज करने का सबसे असरदार तरीका तय करता है. साथ ही, वर्चुअल डिसप्ले, सिस्टम में कंपोज किए गए आउटपुट को उपलब्ध कराते हैं. जैसे, स्क्रीन को रिकॉर्ड करना या नेटवर्क पर स्क्रीन भेजना.
  • Surface, canvas, और SurfaceHolder. कोई सर्फ़ेस, बफ़र कतार बनाता है. आम तौर पर, SurfaceFlinger इसका इस्तेमाल करता है. किसी प्लैटफ़ॉर्म पर रेंडर करने पर, नतीजा एक बफ़र में दिखता है. कैनवस एपीआई, सीधे किसी सतह पर ड्रॉ करने के लिए, हार्डवेयर-ऐक्सेलरेशन की सुविधा के साथ सॉफ़्टवेयर लागू करने का तरीका उपलब्ध कराते हैं. यह 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, एक सरफ़ेस और व्यू को जोड़ता है. SurfaceView के व्यू कॉम्पोनेंट को SurfaceFlinger (न कि ऐप्लिकेशन) से कॉम्पोज़ किया जाता है. इससे, अलग थ्रेड/प्रोसेस से रेंडरिंग की सुविधा मिलती है. साथ ही, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) की रेंडरिंग से अलग किया जा सकता है. GLSurfaceView, EGL कॉन्टेक्स्ट, इंटरथ्रेड कम्यूनिकेशन, और ऐक्टिविटी लाइफ़साइकल के साथ इंटरैक्शन को मैनेज करने के लिए, हेल्पर क्लास उपलब्ध कराता है. हालांकि, GLES का इस्तेमाल करने के लिए, इन क्लास का इस्तेमाल करना ज़रूरी नहीं है.
  • SurfaceTexture. SurfaceTexture, किसी बफ़र क्यू बनाने के लिए, किसी सरफ़ेस और GLES टेक्सचर को आपस में जोड़ता है. इस बफ़र क्यू का उपभोक्ता आपका ऐप्लिकेशन होता है. जब कोई प्रोड्यूसर किसी नए बफ़र को कतार में जोड़ता है, तो वह आपके ऐप्लिकेशन को सूचना देता है. इसके बाद, ऐप्लिकेशन पहले से मौजूद बफ़र को रिलीज़ करता है और कतार से नया बफ़र हासिल करता है. साथ ही, बफ़र को बाहरी टेक्सचर के तौर पर GLES के लिए उपलब्ध कराने के लिए, EGL कॉल करता है. Android 7.0 में, सुरक्षित टेक्स्चर वीडियो चलाने की सुविधा जोड़ी गई है. इससे, सुरक्षित वीडियो कॉन्टेंट को पोस्ट-प्रोसेस करने के लिए, जीपीयू का इस्तेमाल किया जा सकता है.
  • TextureView. TextureView, किसी व्यू को SurfaceTexture के साथ जोड़ता है. TextureView, SurfaceTexture को रैप करता है और कॉलबैक का जवाब देने और नए बफ़र हासिल करने की ज़िम्मेदारी लेता है. ड्रॉ करते समय, TextureView अपने डेटा सोर्स के तौर पर सबसे हाल ही में मिले बफ़र के कॉन्टेंट का इस्तेमाल करता है. साथ ही, यह विज़ुअल स्टेटस के हिसाब से, जहां और जिस तरह से ज़रूरी हो वहां और उस तरह से रेंडर करता है. व्यू कॉम्पोज़िशन हमेशा GLES की मदद से किया जाता है. इसका मतलब है कि कॉन्टेंट में किए गए अपडेट की वजह से, व्यू के अन्य एलिमेंट भी फिर से रेंडर हो सकते हैं.