EGLSurfaces و OpenGL ES

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 جابه‌جا شود. ‫EGLSurface باید در هر زمان فقط در یک رشته جاری باشد.

EGL جنبه دیگری از سطح نیست، مانند SurfaceHolder. ‫EGLSurface مفهومی مرتبط اما مستقل است. می‌توانید روی EGLSurface که با سطحی پشتیبانی نمی‌شود نقاشی کنید و می‌توانید بدون EGL از سطح استفاده کنید. ‫EGLSurface به GLES مکانی برای رسم کردن می‌دهد.

برای الزامات OpenGL ES و EGL، به سند تعریف سازگاری Android مراجعه کنید.

ANativeWindow

کلاس سطح عمومی در زبان برنامه‌نویسی Java پیاده‌سازی شده است. معادل آن در C/C++ کلاس ANativeWindow است که تا حدودی توسط Android NDK آشکار شده است. می‌توانید ANativeWindow را از سطح با تماس ANativeWindow_fromSurface() دریافت کنید. درست مثل همتای زبان جاوا، می‌توانید آن را قفل کنید، در نرم‌افزار رندر کنید، و قفل آن را باز کنید و پست کنید. نوع پنجره بومی پایه، سمت تولیدکننده یک BufferQueue است.

برای ایجاد سطح پنجره EGL از کد بومی، نمونه‌ای از EGLNativeWindowType را به eglCreateWindowSurface() ارسال کنید. ‫EGLNativeWindowType مترادف ANativeWindow است، بنابراین می‌توانید یکی را به دیگری تبدیل کنید.