يستخدم Android واجهة برمجة تطبيقات OpenGL ES (GLES) لتقديم الرسومات. لإنشاء سياقات GLES وتوفير نظام نوافذ لعروض GLES ، يستخدم Android مكتبة EGL . تقدم مكالمات GLES مضلعات مزخرفة ، بينما تضع مكالمات EGL عروض على الشاشات.
قبل الرسم باستخدام GLES ، تحتاج إلى إنشاء سياق GL. في EGL ، هذا يعني إنشاء EGLContext و EGLSurface. تنطبق عمليات GLES على السياق الحالي ، والذي يتم الوصول إليه من خلال التخزين المحلي للخيط بدلاً من تمريره كوسيطة. يجب أن يتم تنفيذ رمز العرض على مؤشر ترابط GLES حالي ، وليس مؤشر ترابط واجهة المستخدم.
EGL الأسطح
يمكن أن يكون سطح EGLSurface عبارة عن مخزن مؤقت خارج الشاشة مخصص بواسطة EGL ، يسمى pbuffer ، أو نافذة مخصصة بواسطة نظام التشغيل. يؤدي استدعاء eglCreateWindowSurface()
إلى إنشاء أسطح نافذة EGL. eglCreateWindowSurface()
كائن نافذة كوسيطة ، وهو سطح على Android. السطح هو جانب المنتج من BufferQueue. يقوم المستهلكون ، وهم SurfaceView أو SurfaceTexture أو TextureView أو ImageReader ، بإنشاء الأسطح. عند استدعاء eglCreateWindowSurface()
، تقوم EGL بإنشاء كائن EGLSurface جديد وتوصيله بواجهة المنتج الخاصة بكائن النافذة BufferQueue. من تلك النقطة فصاعدًا ، يؤدي العرض إلى سطح EGLS إلى فصل المخزن المؤقت عن الصفوف ، وعرضه ، ووضعه في قائمة الانتظار للاستخدام من قبل المستهلك.
لا يوفر EGL مكالمات قفل / إلغاء تأمين. قم بإصدار أوامر الرسم ثم قم باستدعاء eglSwapBuffers()
لإرسال الإطار الحالي. يأتي اسم الطريقة من التبادل التقليدي للمخازن المؤقتة الأمامية والخلفية ، لكن التنفيذ الفعلي قد يكون مختلفًا.
يمكن ربط EGLSurface واحد فقط بسطح في المرة الواحدة (يمكن أن يكون لديك منتج واحد فقط متصل بـ BufferQueue) ، ولكن إذا قمت بتدمير EGLSurface ، فإنه ينفصل عن BufferQueue ويسمح لشيء آخر بالاتصال.
يمكن لخيط معين التبديل بين أسطح EGLS متعددة عن طريق تغيير ما هو حالي . يجب أن يكون سطح EGLSurface محدثًا في مؤشر ترابط واحد فقط في كل مرة.
EGL ليس جانبًا آخر للسطح (مثل SurfaceHolder). EGLSurface هو مفهوم متصل ولكنه مستقل. يمكنك الرسم على سطح EGL غير مدعوم بسطح ، ويمكنك استخدام سطح بدون EGL. يوفر EGLSurface مكانًا للرسم GLES.
راجع مستند تعريف توافق Android للحصول على متطلبات OpenGL ES و EGL.
ANativeWindow
يتم تطبيق فئة السطح العام بلغة برمجة Java. المكافئ في C / C ++ هو فئة ANativeWindow ، شبه مكشوفة بواسطة Android NDK . يمكنك الحصول على ANativeWindow من سطح باستخدام استدعاء ANativeWindow_fromSurface()
. تمامًا مثل ابن عمه بلغة جافا ، يمكنك قفله وعرضه في البرنامج وفتحه ونشره. نوع النافذة الأصلي الأساسي هو جانب المنتج من BufferQueue.
لإنشاء سطح نافذة EGL من التعليمات البرمجية الأصلية ، قم بتمرير مثيل EGLNativeWindowType إلى eglCreateWindowSurface()
. إن EGLNativeWindowType هو مرادف لـ ANativeWindow ، لذا يمكنك تحويل أحدهما إلى الآخر.