Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

EGLurfaces和OpenGL ES

Android使用OpenGL ES(GLES) API渲染圖形。為了創建GLES上下文並提供用於GLES渲染的窗口系統,Android使用EGL庫 。 GLES調用渲染帶紋理的多邊形,而EGL調用將渲染顯示在屏幕上。

使用GLES繪製之前,需要創建GL上下文。在EGL中,這意味著創建EGLContext和EGLSurface。 GLES操作適用於當前上下文,該上下文通過線程本地存儲訪問,而不是作為參數傳遞。渲染代碼應在當前的GLES線程而不是UI線程上執行。

EGL表面

EGLSurface可以是EGL分配的屏幕外緩衝區,稱為pbuffer ,也可以是操作系統分配的窗口。調用eglCreateWindowSurface()函數可創建EGL窗口表面。 eglCreateWindowSurface()窗口對像作為參數,在Android上是一個表面。表面是BufferQueue的生產方。 使用 SurfaceView,SurfaceTexture,TextureView或ImageReader的使用者創建表面。當您調用eglCreateWindowSurface() ,EGL將創建一個新的EGLSurface對象,並將其連接到窗口對象的BufferQueue的生產者接口。從那時起,渲染到該EGLSurface會導致緩衝區出列,渲染到隊列中並由消費者排隊使用。

EGL不提供鎖定/解鎖調用。發出繪圖命令,然後調用eglSwapBuffers()提交當前幀。方法名稱來自傳統的前後緩衝區交換,但是實際實現可能有所不同。

一次只能將一個EGLSurface與一個表面關聯(您只能將一個生產者連接到BufferQueue),但是如果銷毀EGLSurface,它將與BufferQueue斷開連接並允許其他連接。

一個給定的線程可以通過改變什麼是當前多EGLSurfaces之間切換。 EGLSurface一次只能在一個線程上是最新的。

EGL不是曲面的另一個方面(例如SurfaceHolder)。 EGLSurface是一個相關但獨立的概念。您可以在沒有曲面支持的EGLSurface上進行繪製,並且可以使用沒有EGL的曲面。 EGLSurface只是為GLES提供繪製的地方。

有關OpenGL ES和EGL的要求,請參閱Android 兼容性定義文檔

ANativeWindow

公共表麵類以Java編程語言實現。在C / C ++中,等效項是由Android NDK半公開的ANativeWindow類。您可以使用ANativeWindow_fromSurface()調用從曲面獲取ANativeWindow。就像它的Java語言表親一樣,您可以對其進行鎖定,使用軟件進行渲染以及進行解鎖和發布。基本的本機窗口類型是BufferQueue的生產者端。

要從本機代碼創建EGL窗口表面,請將eglCreateWindowSurface()的實例傳遞給eglCreateWindowSurface() 。 EGLNativeWindowType是ANativeWindow的同義詞,因此您可以將其強制轉換為另一種。