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的同義詞,因此您可以將其強制轉換為另一種。