EGLSurfaces و OpenGL ES

اندروید از OpenGL ES (GLES) API برای ارائه گرافیک استفاده می کند. برای ایجاد زمینه های GLES و ارائه یک سیستم پنجره برای رندرهای GLES، Android از کتابخانه EGL استفاده می کند. فراخوانی‌های GLES چند ضلعی‌های بافت‌دار را رندر می‌کنند، در حالی که فراخوان‌های EGL رندرهایی را روی صفحه نمایش می‌دهند.

قبل از ترسیم با GLES، باید یک زمینه GL ایجاد کنید. در EGL، این به معنای ایجاد یک EGLContext و یک EGLSurface است. عملیات GLES در زمینه فعلی اعمال می شود، که به جای ارسال به عنوان آرگومان، از طریق ذخیره سازی رشته محلی قابل دسترسی است. کد رندر باید روی رشته GLES فعلی اجرا شود، نه رشته UI.

سطوح EGLS

EGLSurface می تواند یک بافر خارج از صفحه باشد که توسط EGL تخصیص داده شده است، که pbuffer نامیده می شود، یا یک پنجره اختصاص داده شده توسط سیستم عامل. فراخوانی تابع eglCreateWindowSurface() سطوح پنجره EGL را ایجاد می کند. eglCreateWindowSurface() یک شی پنجره را به عنوان آرگومان می گیرد که در اندروید یک سطح است. یک سطح، سمت تولید کننده یک BufferQueue است. مصرف کنندگان ، که SurfaceView، SurfaceTexture، TextureView یا ImageReader هستند، سطوح را ایجاد می کنند. هنگامی که eglCreateWindowSurface() را فرا می‌خوانید، EGL یک شی EGLSurface جدید ایجاد می‌کند و آن را به رابط تولیدکننده BufferQueue شی پنجره متصل می‌کند. از آن نقطه به بعد، رندر کردن به آن EGLSurface باعث می‌شود که یک بافر در صف قرار گیرد، در آن رندر شود و برای استفاده توسط مصرف‌کننده در صف قرار گیرد.

EGL تماس های قفل/باز کردن قفل را ارائه نمی دهد. دستورات ترسیم را صادر کنید و سپس eglSwapBuffers() برای ارسال فریم فعلی فراخوانی کنید. نام روش از تعویض سنتی بافرهای جلو و عقب گرفته شده است، اما اجرای واقعی ممکن است متفاوت باشد.

فقط یک EGLSurface می تواند در یک زمان با یک سطح مرتبط شود (شما می توانید فقط یک تولید کننده متصل به BufferQueue داشته باشید)، اما اگر EGLSurface را از بین ببرید از BufferQueue جدا می شود و اجازه می دهد چیز دیگری وصل شود.

یک رشته معین می‌تواند با تغییر میزان فعلی بین چندین سطح EGLS جابجا شود. یک EGLSurface باید فقط در یک رشته در یک زمان جاری باشد.

EGL جنبه دیگری از یک سطح نیست (مانند SurfaceHolder). EGLSurface یک مفهوم مرتبط اما مستقل است. می توانید روی یک سطح EGLS طراحی کنید که توسط سطحی پشتیبان آن نیست و می توانید از سطحی بدون EGL استفاده کنید. EGLSurface فقط مکانی برای طراحی GLES فراهم می کند.

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

ANativeWindow

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

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