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() לוקח אובייקט חלון כארגומנט, שב-Android הוא משטח. משטח הוא הצד המפיק של BufferQueue. צרכנים , שהם SurfaceView, SurfaceTexture, TextureView או ImageReader, יוצרים משטחים. כאשר אתה קורא ל- eglCreateWindowSurface() , EGL יוצר אובייקט EGLSurface חדש ומחבר אותו לממשק המפיק של BufferQueue של אובייקט החלון. מנקודה זו ואילך, רינדור לאותו EGLSurface מביא להוצאת חיץ בתור, עיבוד לתוך ותור לשימוש על ידי הצרכן.

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

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

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

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

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

ANativeWindow

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

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