Android, ग्राफ़िक रेंडर करने के लिए OpenGL ES (GLES) एपीआई का इस्तेमाल करता है. Android, GLES कॉन्टेक्स्ट बनाने और GLES रेंडरिंग के लिए विंडो सिस्टम उपलब्ध कराने के लिए, EGL लाइब्रेरी का इस्तेमाल करता है. GLES कॉल, टेक्सचर वाले पॉलीगॉन रेंडर करते हैं. वहीं, EGL कॉल, रेंडरिंग को स्क्रीन पर दिखाते हैं.
GLES का इस्तेमाल करके ड्रॉ करने से पहले, आपको GL कॉन्टेक्स्ट बनाना होगा. EGL में इसका मतलब है कि EGLContext और EGLSurface बनाना. GLES ऑपरेशन, मौजूदा कॉन्टेक्स्ट पर लागू होते हैं. इसे थ्रेड-लोकल स्टोरेज के ज़रिए ऐक्सेस किया जाता है. इसे आर्ग्युमेंट के तौर पर पास नहीं किया जाता. रेंडरिंग कोड को GLES थ्रेड पर एक्ज़ीक्यूट किया जाना चाहिए, न कि यूज़र इंटरफ़ेस (यूआई) थ्रेड पर.
EGLSurfaces
EGLSurface, EGL की ओर से असाइन किया गया कोई ऑफ़-स्क्रीन बफ़र हो सकता है. इसे pbuffer कहा जाता है. इसके अलावा, यह ऑपरेटिंग सिस्टम की ओर से असाइन की गई कोई विंडो भी हो सकती है. eglCreateWindowSurface()
फ़ंक्शन को कॉल करने से, EGL विंडो सर्फ़ेस बनते हैं.
eglCreateWindowSurface()
, विंडो ऑब्जेक्ट को आर्ग्युमेंट के तौर पर लेता है. Android पर यह एक सरफेस होता है. सरफ़ेस, BufferQueue का प्रोड्यूसर होता है. कंज्यूमर, जैसे कि SurfaceView, SurfaceTexture, TextureView या ImageReader, सर्फ़ेस बनाते हैं.
eglCreateWindowSurface()
को कॉल करने पर, EGL एक नया EGLSurface ऑब्जेक्ट बनाता है और उसे विंडो ऑब्जेक्ट के BufferQueue के प्रोड्यूसर इंटरफ़ेस से कनेक्ट करता है. इसके बाद, EGLSurface में रेंडर करने के लिए, एक बफ़र को डीक्यू किया जाता है. फिर, उसमें रेंडर किया जाता है और उसे उपभोक्ता के इस्तेमाल के लिए क्यू किया जाता है.
EGL, लॉक/अनलॉक करने के लिए कॉल उपलब्ध नहीं कराता. ड्राइंग के निर्देश दें. इसके बाद, मौजूदा फ़्रेम सबमिट करने के लिए eglSwapBuffers()
को कॉल करें. इस तरीके का नाम, फ़्रंट और बैक बफ़र के पारंपरिक स्वैप से लिया गया है. हालांकि, इसका असल तरीका अलग हो सकता है.
एक समय में, किसी सरफेस से सिर्फ़ एक EGLSurface को जोड़ा जा सकता है. साथ ही, BufferQueue से सिर्फ़ एक प्रोड्यूसर को कनेक्ट किया जा सकता है. हालांकि, EGLSurface को बंद करने पर, वह BufferQueue से डिसकनेक्ट हो जाता है. इसके बाद, किसी दूसरे प्रोड्यूसर को कनेक्ट किया जा सकता है.
किसी थ्रेड के लिए, एक से ज़्यादा EGLSurface के बीच स्विच किया जा सकता है. इसके लिए, current को बदलना होगा. EGLSurface को एक बार में सिर्फ़ एक थ्रेड पर चालू किया जाना चाहिए.
EGL, SurfaceHolder जैसी किसी सतह का दूसरा पहलू नहीं है. EGLSurface एक अलग कॉन्सेप्ट है, लेकिन यह इससे जुड़ा हुआ है. आपके पास ऐसी EGLSurface पर ड्रॉ करने का विकल्प होता है जो किसी सरफेस से जुड़ी नहीं होती. साथ ही, EGL के बिना भी किसी सरफेस का इस्तेमाल किया जा सकता है. EGLSurface, GLES को ड्रॉ करने की जगह उपलब्ध कराता है.
OpenGL ES और EGL की ज़रूरी शर्तों के लिए, Android का कंपैटबिलिटी डेफ़िनिशन डॉक्यूमेंट देखें.
ANativeWindow
सार्वजनिक सरफेस क्लास को Java प्रोग्रामिंग लैंग्वेज में लागू किया जाता है. C/C++ में इसके बराबर की क्लास, ANativeWindow क्लास है. इसे Android NDK के ज़रिए कुछ हद तक ऐक्सेस किया जा सकता है. ANativeWindow_fromSurface()
कॉल करके, किसी सर्फ़ेस से ANativeWindow पाया जा सकता है. Java-भाषा में लिखे गए इसके वर्शन की तरह ही, इसे लॉक किया जा सकता है, सॉफ़्टवेयर में रेंडर किया जा सकता है, और अनलॉक करके पोस्ट किया जा सकता है. बेसिक नेटिव विंडो टाइप, BufferQueue का प्रोड्यूसर साइड होता है.
नेटिव कोड से EGL विंडो सरफेस बनाने के लिए, eglCreateWindowSurface()
को EGLNativeWindowType का इंस्टेंस पास करें. EGLNativeWindowType, ANativeWindow का दूसरा नाम है. इसलिए, एक को दूसरे में कास्ट किया जा सकता है.