يستخدم نظام التشغيل 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 مكانًا للرسم.
راجِع مستند تعريف التوافق لنظام التشغيل Android لمعرفة متطلبات OpenGL ES وEGL.
ANativeWindow
يتم تنفيذ فئة المساحة العرضية العامة في لغة البرمجة Java. الفئة المكافئة في C/C++ هي فئة ANativeWindow، التي يعرضها Android NDK بشكل جزئي. يمكنك الحصول على ANativeWindow من مساحة عرض باستخدام استدعاء ANativeWindow_fromSurface()
. وكما هو الحال مع الإصدار المشابه بلغة Java، يمكنك قفلها وعرضها في البرنامج وفتحها ونشرها. نوع النافذة الأصلية الأساسي هو جانب المنتج في BufferQueue.
لإنشاء مساحة نافذة EGL من الرمز البرمجي الأصلي، مرِّر مثيلاً من
EGLNativeWindowType إلى eglCreateWindowSurface()
. EGLNativeWindowType هو مرادف لـ ANativeWindow، لذا يمكنك تحويل أحدهما إلى الآخر.