Android, ग्राफ़िक रेंडर करने के लिए OpenGL ES (GLES) एपीआई का इस्तेमाल करता है. GLES कॉन्टेक्स्ट बनाने और GLES रेंडरिंग के लिए विंडो सिस्टम उपलब्ध कराने के लिए, Android 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 को बदलकर, एक से ज़्यादा EGLSurfaces के बीच स्विच कर सकता है. EGLSurface, एक बार में सिर्फ़ एक थ्रेड पर मौजूद होना चाहिए.
EGL, SurfaceHolder की तरह किसी प्लैटफ़ॉर्म का कोई दूसरा हिस्सा नहीं है. EGLSurface, EGL के साथ जुड़ा हुआ है, लेकिन यह एक अलग कॉन्सेप्ट है. किसी ऐसे EGLSurface पर ड्रॉ किया जा सकता है जिसे किसी सतह से मैनेज नहीं किया जाता. साथ ही, EGL के बिना भी किसी सतह का इस्तेमाल किया जा सकता है. EGLSurface सिर्फ़ GLES को ड्रॉ करने की जगह उपलब्ध कराता है.
OpenGL ES और EGL की ज़रूरी शर्तों के बारे में जानने के लिए, Android का 'काम करने की सुविधा' से जुड़ा दस्तावेज़ देखें.
ANativeWindow
सार्वजनिक प्लैटफ़ॉर्म क्लास, Java प्रोग्रामिंग लैंग्वेज में लागू की जाती है. C/C++ में, इसका एग्ज़ैम्पल ANativeWindow क्लास है. इसे Android NDK से कुछ हद तक एक्सपोज़ किया गया है. ANativeWindow_fromSurface()
कॉल की मदद से, किसी प्लैटफ़ॉर्म से ANativeWindow को ऐक्सेस किया जा सकता है. Java-language के जैसे ही, इसे लॉक किया जा सकता है, सॉफ़्टवेयर में रेंडर किया जा सकता है, और अनलॉक करके पोस्ट किया जा सकता है. बुनियादी नेटिव विंडो टाइप, BufferQueue का प्रोड्यूसर साइड होता है.
नेटिव कोड से EGL विंडो का सरफ़ेस बनाने के लिए, eglCreateWindowSurface()
में EGLNativeWindowType का एक इंस्टेंस पास करें. EGLNativeWindowType, ANativeWindow का एक दूसरा नाम है. इसलिए, एक को दूसरे में कास्ट किया जा सकता है.