EGLSurfaces ו- OpenGL ES

אנדרואיד משתמשת ב- API של OpenGL ES (GLES) כדי לעבד גרפיקה. כדי ליצור הקשרים של GLES ולספק מערכת חלונות לעיבוד GLES, אנדרואיד משתמש בספריית EGL . שיחות GLES מעבירות מצולעים מרקמים, ואילו שיחות EGL מעלות עיבודים על המסכים.

לפני שאתה מצייר עם GLES, עליך ליצור הקשר של GL. ב- EGL, המשמעות היא יצירת EGLContext ו- EGLSurface. פעולות GLES חלות על ההקשר הנוכחי, אליו ניגשים באמצעות אחסון מקומי של שרשור ולא מועברים כארגומנט. קוד העיבוד אמור להתבצע על שרשור GLES הנוכחי, ולא על שרשור ממשק המשתמש.

משטחי EGLS

ה- EGLSurface יכול להיות מאגר מחוץ למסך שהוקצה על ידי EGL, הנקרא pbuffer , או חלון שהוקצה על ידי מערכת ההפעלה. קריאה eglCreateWindowSurface() יוצרת משטחי חלון EGL. eglCreateWindowSurface() לוקח אובייקט חלון כארגומנט, eglCreateWindowSurface() Android הוא משטח. משטח הוא הצד המפיק של BufferQueue. צרכנים שהם SurfaceView, SurfaceTexture, TextureView או ImageReader, יוצרים משטחים. כאשר אתה קורא eglCreateWindowSurface() , EGL יוצר אובייקט EGLSurface חדש ומחבר אותו לממשק המפיק של BufferQueue של אובייקט החלון. מאותה נקודה ואילך, טיוח לאותו EGLSurface מביא למאגר שמונח, הופך לתור לשימוש על ידי הצרכן.

EGL אינו מספק שיחות נעילה / ביטול נעילה. eglSwapBuffers() פקודות ציור ואז התקשר ל- eglSwapBuffers() כדי לשלוח את המסגרת הנוכחית. שם השיטה מקורו בהחלפה המסורתית של מאגרי חזית ומאחור, אך היישום בפועל עשוי להיות שונה.

רק EGLSurface אחד יכול להיות משויך למשטח בכל פעם (יכול להיות שמפיק רק אחד מחובר ל- BufferQueue), אך אם אתה הורס את ה- EGLSurface הוא מתנתק מה- BufferQueue ומאפשר למשהו אחר להתחבר.

שרשור נתון יכול לעבור בין מספר משטחי EGLS על ידי שינוי מה הנוכחי . משטח EGLS חייב להיות עדכני על חוט אחד בלבד בכל פעם.

EGL אינו היבט נוסף של משטח (כמו SurfaceHolder). EGLSurface הוא מושג קשור אך עצמאי. אתה יכול לצייר על משטח EGLS שאינו מגובה על ידי משטח, ואתה יכול להשתמש במשטח ללא EGL. EGLSurface רק מספק ל- GLES מקום לצייר.

עיין במסמך הגדרת התאימות של Android לדרישות OpenGL ES ו- EGL.

ANativeWindow

מעמד השטח הציבורי מיושם בשפת התכנות Java. המקבילה ב- C / C ++ היא מחלקת ANativeWindow, שנחשפה למחצה על ידי אנדרואיד NDK . אתה יכול לקבל את ANativeWindow ממשטח באמצעות שיחת ANativeWindow_fromSurface() . בדיוק כמו בן דודו בשפת Java, אתה יכול לנעול אותו, לעבד אותו בתוכנה ולפתוח ולפרסם. סוג החלון המקורי הבסיסי הוא הצד המפיק של BufferQueue.

כדי ליצור משטח חלון EGL מקוד מקורי, העבירו מופע של EGLNativeWindowType ל- eglCreateWindowSurface() . EGLNativeWindowType הוא מילה נרדפת ל- ANativeWindow, כך שתוכלו להעביר אחד לשני.