Android do renderowania grafiki używa interfejsu API OpenGL ES (GLES). Aby tworzyć konteksty GLES i zapewniać system okien dla renderowania GLES, Android używa biblioteki EGL. GLES wywołuje renderowanie wielokątów z teksturą, a EGL wywołuje renderowanie 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 przekazywanej jako argumentu. Kod renderowania powinien być wykonywany na bieżącym wątku GLES, a nie na wątku interfejsu użytkownika.
EGLSurfaces
EGLSurface może być buforem poza ekranem przypisanym przez EGL, zwanym pbuforem, lub oknem przypisanym przez system operacyjny. Wywołanie funkcji eglCreateWindowSurface()
tworzy powierzchnie okna EGL.
eglCreateWindowSurface()
przyjmuje jako argument obiekt okna, który na Androidzie jest powierzchnią. Powierzchnia to producent kolejki buforowej. Klienci, czyli SurfaceView, SurfaceTexture, TextureView lub ImageReader, tworzą powierzchnie.
Gdy wywołasz funkcję eglCreateWindowSurface()
, EGL tworzy nowy obiekt EGLSurface i łączy go z interfejsem producenta kolejki BufferQueue obiektu okna. Od tego momentu renderowanie do tego obiektu EGLSurface powoduje usunięcie bufora z kolejki, jego wyrenderowanie i ustawienie w kolejce do użycia przez konsumenta.
EGL nie obsługuje wywołań blokowania i odblokowywania. Wyślij polecenia rysowania, a potem wywołaj eglSwapBuffers()
, aby przesłać bieżącą ramkę. Nazwa metody pochodzi od tradycyjnego zamieniania buforów przedniego i tylnego, ale rzeczywista implementacja może być inna.
Z powierzchnią może być powiązany tylko jeden obiekt EGLSurface naraz (do BufferQueue może być podłączony tylko jeden producent), ale jeśli zniszczymy EGLSurface, zostanie on odłączony od BufferQueue i coś innego będzie mogło się z nim połączyć.
Określony wątek może przełączać się między wieloma EGLSurfaces, zmieniając wartość current. Obiekt EGLSurface musi być aktualny tylko w jednym wątku naraz.
EGL nie jest kolejnym aspektem powierzchni (jak SurfaceHolder). EGLSurface to powiązana, ale niezależna koncepcja. Możesz rysować na EGLSurface, który nie jest obsługiwany przez powierzchnię, oraz używać powierzchni bez EGL. EGLSurface udostępnia GLES miejsce do rysowania.
Wymagania dotyczące OpenGL ES i EGL znajdziesz w dokumentacji dotyczącej zgodności na Androidzie.
ANativeWindow
Publiczna klasa powierzchni jest implementowana w języku programowania Java. Jej odpowiednikiem w języku C/C++ jest klasa ANativeWindow, częściowo udostępniana przez NDK Androida. Możesz uzyskać ANativeWindow z powierzchni za pomocą wywołania ANativeWindow_fromSurface()
. Podobnie jak w przypadku języka Java, możesz go zablokować, wyrenderować w oprogramowaniu, a następnie odblokować i opublikować. Podstawowy typ okna natywnego to strona producenta kolejki buforowej.
Aby utworzyć powierzchnię okna EGL z użyciem kodu natywnego, prześlij instancję EGLNativeWindowType do eglCreateWindowSurface()
. EGLNativeWindowType jest synonimem ANativeWindow, więc możesz przekazać jeden z nich do drugiego.