EGLSurfaces i OpenGL ES

Android używa interfejsu API OpenGL ES (GLES) do renderowania grafiki. Aby utworzyć konteksty GLES i zapewnić system okienkowy dla renderowania GLES, Android korzysta z biblioteki EGL . Wywołania GLES renderują teksturowane wielokąty, podczas gdy wywołania EGL umieszczają renderingi na ekranach.

Zanim zaczniesz rysować za pomocą GLES, musisz utworzyć kontekst GL. W EGL oznacza to utworzenie EGLContext i EGLSurface. Operacje GLES dotyczą bieżącego kontekstu, do którego dostęp uzyskuje się poprzez lokalną pamięć wątku, a nie przekazywaną jako argument. Kod renderujący powinien być wykonywany w bieżącym wątku GLES, a nie w wątku interfejsu użytkownika.

Powierzchnie EGL

Powierzchnia EGLSurface może być buforem pozaekranowym 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 w systemie Android jest powierzchnią. Powierzchnia jest stroną producenta BufferQueue. Konsumenci , czyli SurfaceView, SurfaceTexture, StructureView lub ImageReader, tworzą powierzchnie. Kiedy wywołujesz funkcję eglCreateWindowSurface() , EGL tworzy nowy obiekt EGLSurface i łączy go z interfejsem producenta kolejki BufferQueue obiektu okna. Od tego momentu renderowanie do tego EGLSurface powoduje, że bufor jest usuwany z kolejki, renderowany i umieszczany w kolejce do użycia przez konsumenta.

EGL nie zapewnia połączeń blokujących/odblokowujących. Wydaj polecenia rysowania, a następnie wywołaj funkcję eglSwapBuffers() , aby przesłać bieżącą klatkę. Nazwa metody pochodzi od tradycyjnej zamiany buforów przedniego i tylnego, ale faktyczna implementacja może być inna.

Tylko jeden EGLSurface może być powiązany z powierzchnią na raz (do kolejki BufferQueue może być podłączony tylko jeden producent), ale jeśli zniszczysz EGLSurface, rozłączy się on z kolejką BufferQueue i umożliwi połączenie czemuś innemu.

Dany wątek może przełączać się pomiędzy wieloma powierzchniami EGLSurface, zmieniając bieżącą wartość. EGLurface musi być aktualny tylko w jednym wątku na raz.

EGL nie jest kolejnym aspektem powierzchni (jak SurfaceHolder). EGLSurface jest pokrewną, ale niezależną koncepcją. Możesz rysować na powierzchni EGLSurface, która nie jest podparta powierzchnią, i możesz używać powierzchni bez EGL. EGLurface po prostu zapewnia GLES miejsce do rysowania.

Aby zapoznać się z wymaganiami OpenGL ES i EGL, zapoznaj się z dokumentem definicji zgodności systemu Android.

ANativeWindow

Klasa powierzchni publicznej jest zaimplementowana w języku programowania Java. Odpowiednikiem w C/C++ jest klasa ANativeWindow, częściowo uwidoczniona przez Android NDK . Możesz pobrać ANativeWindow z powierzchni za pomocą wywołania ANativeWindow_fromSurface() . Podobnie jak jego kuzyn w języku Java, możesz go blokować, renderować w oprogramowaniu oraz odblokowywać i publikować. Podstawowym natywnym typem okna jest strona producenta kolejki BufferQueue.

Aby utworzyć powierzchnię okna EGL z kodu natywnego, przekaż instancję EGLNativeWindowType do eglCreateWindowSurface() . EGLNativeWindowType jest synonimem ANativeWindow, więc możesz rzutować jedno na drugie.