Android 會使用 OpenGL ES (GLES) API 算繪圖形。為建立 GLES 情境,並為 GLES 算繪提供視窗系統,Android 會使用 EGL 程式庫。GLES 會呼叫紋理多邊形算繪作業,而 EGL 則會將算繪作業放到螢幕上。
使用 GLES 繪圖前,您必須先建立 GL 內容。在 EGL 中,這表示建立 EGLContext 和 EGLSurface。GLES 作業會套用至目前的背景,該背景會透過執行緒本機儲存空間存取,而非以引數形式傳遞。轉譯程式碼應在目前的 GLES 執行緒上執行,而非 UI 執行緒。
EGLSurfaces
EGLSurface 可以是 EGL 分配的螢幕外緩衝區 (稱為 pbuffer),或作業系統分配的視窗。呼叫 eglCreateWindowSurface()
函式會建立 EGL 視窗介面。eglCreateWindowSurface()
會將 window 物件做為引數,在 Android 上為介面。途徑是 BufferQueue 的生產端。消費者 (即 SurfaceView、SurfaceTexture、TextureView 或 ImageReader) 會建立途徑。呼叫 eglCreateWindowSurface()
時,EGL 會建立新的 EGLSurface 物件,並將其連結至視窗物件的 BufferQueue 生產端介面。從那個時間點開始,將內容算繪至該 EGLSurface 會導致緩衝區從佇列中移除、算繪至緩衝區,並排入佇列供使用者使用。
EGL 不會提供鎖定/解鎖呼叫。發出繪圖指令,然後呼叫 eglSwapBuffers()
提交目前的框架。方法名稱源自傳統的前後緩衝區交換,但實際實作方式可能不同。
每次只能將一個 EGLSurface 與途徑建立關聯 (您只能讓一個生產者連線至 BufferQueue),但如果您摧毀 EGLSurface,它會與 BufferQueue 中斷連線,並讓其他項目連線。
特定執行緒可以變更current,在多個 EGLSurface 之間切換。EGLSurface 一次只能在一個執行緒上顯示。
EGL 並非 Surface (例如 SurfaceHolder) 的另一個面向。EGLSurface 是相關但獨立的概念。您可以在未由途徑支援的 EGLSurface 上繪製,也可以在沒有 EGL 的情況下使用途徑。EGLSurface 只是為 GLES 提供繪圖位置。
如要瞭解 OpenGL ES 和 EGL 需求,請參閱 Android 相容性定義說明文件。
ANativeWindow
公開途徑類別是以 Java 程式設計語言實作。在 C/C++ 中,ANativeWindow 類別是相應的元素,由 Android NDK 半公開。您可以使用 ANativeWindow_fromSurface()
呼叫,從途徑取得 ANativeWindow。就像 Java 語言的親戚一樣,您可以鎖定、在軟體中算繪,以及解鎖並發布。基本的原生視窗類型是 BufferQueue 的生產者端。
如要透過原生程式碼建立 EGL 視窗途徑,請將 EGLNativeWindowType 的例項傳遞至 eglCreateWindowSurface()
。EGLNativeWindowType 是 ANativeWindow 的同義詞,因此您可以將其中一個投放到另一個。