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