EGLSurfaces 和 OpenGL ES

Android 會使用 OpenGL ES (GLES) API 算繪圖形。Android 會使用 EGL 程式庫建立 GLES 情境,並為 GLES 算繪作業提供視窗系統。GLES 呼叫會算繪紋理多邊形,而 EGL 呼叫則會將算繪內容放在螢幕上。

使用 GLES 繪圖前,您必須先建立 GL 環境。在 EGL 中,這表示要建立 EGLContext 和 EGLSurface。GLES 作業會套用至目前內容,該內容是透過執行緒本機儲存空間存取,而非以引數形式傳遞。轉譯程式碼必須在 GLES 執行緒上執行,而非 UI 執行緒。

EGLSurface

EGLSurface 可以是 EGL 分配的螢幕外緩衝區 (稱為 pbuffer),也可以是作業系統分配的視窗。呼叫 eglCreateWindowSurface() 函式會建立 EGL 視窗介面。eglCreateWindowSurface() 會將視窗物件做為引數,在 Android 上則是介面。表面是 BufferQueue 的生產端消費者 (即 SurfaceView、SurfaceTexture、TextureView 或 ImageReader) 會建立介面。呼叫 eglCreateWindowSurface() 時,EGL 會建立新的 EGLSurface 物件,並將其連線至視窗物件 BufferQueue 的生產端介面。從此之後,算繪至該 EGLSurface 會將緩衝區取消佇列、算繪至緩衝區,並將緩衝區加入佇列,供取用者使用。

EGL 不提供鎖定/解除鎖定呼叫。發出繪圖指令,然後呼叫 eglSwapBuffers() 提交目前影格。方法名稱來自於傳統的前後緩衝區交換,但實際實作方式可能有所不同。

一次只能將一個 EGLSurface 與途徑建立關聯 (您只能將一個製作工具連線至 BufferQueue),但如果您毀損 EGLSurface,系統就會與 BufferQueue 中斷連線,並允許其他項目連線。

特定執行緒可以透過變更目前的內容,在多個 EGLSurface 之間切換。EGLSurface 一次只能在一個執行緒上是目前的執行緒。

EGL 並非 Surface 的其他層面,例如 SurfaceHolder。EGLSurface 是相關但獨立的概念。您可以在沒有 Surface 支援的 EGLSurface 上繪圖,也可以使用沒有 EGL 的 Surface。EGLSurface 可為 GLES 提供繪圖位置。

如要瞭解 OpenGL ES 和 EGL 的需求,請參閱 Android 相容性定義文件

ANativeWindow

公開介面類別是以 Java 程式設計語言實作。C/C++ 中的對等項目是 ANativeWindow 類別,由 Android NDK 半公開。您可以透過 ANativeWindow_fromSurface() 呼叫,從介面取得 ANativeWindow。與 Java 語言的同類產品一樣,您可以鎖定、在軟體中算繪,以及解鎖並發布。基本的原生視窗型別是 BufferQueue 的製作端。

如要從原生程式碼建立 EGL 視窗介面,請將 EGLNativeWindowType 的執行個體傳遞至 eglCreateWindowSurface()。EGLNativeWindowType 是 ANativeWindow 的同義字,因此您可以將其中一個轉換為另一個。