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 ويسمح لشيء آخر بالاتصال.

يمكن لخيط معين التبديل بين واجهات EGLSurfaces المتعددة عن طريق تغيير ما هو حالي . يجب أن يكون EGLSurface محدثًا على مؤشر ترابط واحد فقط في كل مرة.

EGL ليس جانبًا آخر من السطح (مثل SurfaceHolder). EGLSurface هو مفهوم ذو صلة ولكنه مستقل. يمكنك الرسم على سطح EGLS غير مدعوم بسطح، ويمكنك استخدام سطح بدون EGL. يوفر EGLSurface لـ GLES مكانًا للرسم.

راجع مستند تعريف توافق Android للتعرف على متطلبات OpenGL ES وEGL.

ANativeWindow

يتم تنفيذ فئة السطح العامة بلغة برمجة Java. المعادل في C/C++ هو فئة ANativeWindow، شبه مكشوفة بواسطة Android NDK . يمكنك الحصول على ANativeWindow من السطح باستخدام استدعاء ANativeWindow_fromSurface() . تمامًا مثل ابن عمه الذي يستخدم لغة Java، يمكنك قفله وعرضه في البرنامج وفتحه ونشره. نوع النافذة الأصلي الأساسي هو جانب المنتج في BufferQueue.

لإنشاء سطح نافذة EGL من التعليمات البرمجية الأصلية، قم بتمرير مثيل EGLNativeWindowType إلى eglCreateWindowSurface() . EGLNativeWindowType هو مرادف لـ ANativeWindow، لذا يمكنك إرسال أحدهما إلى الآخر.