Obiekty EGLSurface i OpenGL ES

Android używa interfejsu OpenGL ES (GLES) do renderowania grafiki. Aby tworzyć konteksty GLES i zapewniać system okien dla renderowania GLES, Android używa biblioteki EGL. Wywołania GLES renderują wielokąty z teksturami, a wywołania EGL umieszczają renderowane elementy na ekranach.

Zanim zaczniesz rysować za pomocą GLES, musisz utworzyć kontekst GL. W EGL oznacza to utworzenie EGLContext i EGLSurface. Operacje GLES są stosowane do bieżącego kontekstu, do którego dostęp uzyskuje się za pomocą pamięci lokalnej wątku, a nie przez przekazywanie argumentu. Kod renderowania musi być wykonywany w wątku GLES, a nie w wątku interfejsu.

EGLSurfaces

EGLSurface może być buforem poza ekranem przydzielonym przez EGL, zwanym pbufferem, lub oknem przydzielonym przez system operacyjny. Wywołanie funkcji eglCreateWindowSurface() tworzy powierzchnie okien EGL. eglCreateWindowSurface() przyjmuje jako argument obiekt okna, który na Androidzie jest powierzchnią. Powierzchnia to strona producenta kolejki BufferQueue. Konsumenci, czyli SurfaceView, SurfaceTexture, TextureView lub ImageReader, tworzą powierzchnie. Gdy wywołasz eglCreateWindowSurface(), EGL utworzy nowy obiekt EGLSurface i połączy go z interfejsem producenta obiektu okna BufferQueue. Od tego momentu renderowanie do tego obiektu EGLSurface wyjmuje bufor z kolejki, renderuje go i umieszcza w kolejce do użycia przez odbiorcę.

EGL nie udostępnia wywołań blokowania ani odblokowywania. Wydaj polecenia rysowania, a następnie wywołaj funkcję eglSwapBuffers(), aby przesłać bieżącą ramkę. Nazwa metody pochodzi od tradycyjnej zamiany buforów przedniego i tylnego, ale rzeczywista implementacja może być inna.

Z powierzchnią może być powiązana tylko jedna wartość EGLSurface (z kolejką BufferQueue może być połączony tylko jeden producent), ale jeśli zniszczysz EGLSurface, odłączy się ona od kolejki BufferQueue i umożliwi połączenie z nią innemu elementowi.

Dany wątek może przełączać się między wieloma obiektami EGLSurface, zmieniając to, co jest bieżące. Obiekt EGLSurface musi być aktualny tylko w jednym wątku naraz.

EGL nie jest innym aspektem powierzchni, takim jak SurfaceHolder. EGLSurface to powiązana, ale niezależna koncepcja. Możesz rysować na obiekcie EGLSurface, który nie jest obsługiwany przez powierzchnię, a także używać powierzchni bez EGL. EGLSurface zapewnia GLES miejsce do rysowania.

Wymagania dotyczące OpenGL ES i EGL znajdziesz w dokumencie Compatibility Definition Document na Androidzie.

ANativeWindow

Klasa powierzchni publicznej jest zaimplementowana w języku programowania Java. Odpowiednikiem w C/C++ jest klasa ANativeWindow, częściowo udostępniana przez Android NDK. Obiekt ANativeWindow możesz uzyskać z powierzchni za pomocą wywołania ANativeWindow_fromSurface(). Podobnie jak w przypadku jego odpowiednika w języku Java możesz go zablokować, wyrenderować w oprogramowaniu oraz odblokować i opublikować. Podstawowy typ okna natywnego to strona producenta w obiekcie BufferQueue.

Aby utworzyć powierzchnię okna EGL z kodu natywnego, przekaż instancję EGLNativeWindowType do eglCreateWindowSurface(). EGLNativeWindowType to synonim ANativeWindow, więc możesz rzutować jeden typ na drugi.