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 هو مفهوم مرتبط ولكن مستقل. يمكنك الرسم على EGLSurface غير المستندة إلى سطح، ويمكنك استخدام سطح بدون EGL. لا يقدّم EGLSurface سوى مساحة للرسم في GLES.

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

ANativeWindow

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

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