Android sử dụng API OpenGL ES (GLES) để kết xuất đồ họa. Để tạo bối cảnh GLES và cung cấp hệ thống cửa sổ cho hiển thị GLES, Android sử dụng thư viện EGL . Các lệnh gọi GLES kết xuất đa giác có kết cấu, trong khi lệnh gọi EGL đưa các kết xuất lên màn hình.
Trước khi bạn vẽ bằng GLES, bạn cần tạo bối cảnh GL. Trong EGL, điều này có nghĩa là tạo một EGLContext và một EGLSurface. Các hoạt động GLES áp dụng cho ngữ cảnh hiện tại, được truy cập thông qua lưu trữ cục bộ luồng thay vì được truyền dưới dạng đối số. Mã kết xuất phải thực thi trên một chuỗi GLES hiện tại, không phải chuỗi giao diện người dùng.
EGLSurfaces
EGLSurface có thể là một bộ đệm ngoài màn hình được phân bổ bởi EGL, được gọi là bộ đệm hoặc một cửa sổ do hệ điều hành cấp phát. Gọi hàm eglCreateWindowSurface()
sẽ tạo ra các bề mặt cửa sổ EGL. eglCreateWindowSurface()
lấy một đối tượng cửa sổ làm đối số, đối tượng này trên Android là một bề mặt. Bề mặt là mặt sản xuất của BufferQueue. Người tiêu dùng , là SurfaceView, SurfaceTexture, TextureView hoặc ImageReader, tạo ra các bề mặt. Khi bạn gọi eglCreateWindowSurface()
, EGL tạo một đối tượng EGLSurface mới và kết nối nó với giao diện nhà sản xuất BufferQueue của đối tượng cửa sổ. Từ thời điểm đó trở đi, việc hiển thị EGLSurface đó dẫn đến một bộ đệm được định giá lại, kết xuất vào và xếp hàng để người tiêu dùng sử dụng.
EGL không cung cấp cuộc gọi khóa / mở khóa. Đưa ra các lệnh vẽ và sau đó gọi eglSwapBuffers()
để gửi khung hiện tại. Tên phương thức xuất phát từ hoán đổi truyền thống của bộ đệm trước và sau, nhưng cách triển khai thực tế có thể khác.
Chỉ một EGLSurface có thể được liên kết với một bề mặt tại một thời điểm (bạn có thể chỉ có một nhà sản xuất được kết nối với BufferQueue), nhưng nếu bạn phá hủy EGLSurface, nó sẽ ngắt kết nối khỏi BufferQueue và cho phép thứ khác kết nối.
Một luồng nhất định có thể chuyển đổi giữa nhiều EGLSurfaces bằng cách thay đổi những gì hiện tại . Một EGLSurface chỉ được hiện tại trên một luồng tại một thời điểm.
EGL không phải là một khía cạnh khác của bề mặt (như SurfaceHolder). EGLSurface là một khái niệm có liên quan nhưng độc lập. Bạn có thể vẽ trên một bề mặt EGLSurface không được hỗ trợ bởi bề mặt và bạn có thể sử dụng bề mặt không có EGL. EGLSurface chỉ cung cấp cho GLES một nơi để vẽ.
Tham khảo Tài liệu Định nghĩa Tương thích của Android để biết các yêu cầu của OpenGL ES và EGL.
ANativeWindow
Lớp bề mặt công khai được thực hiện bằng ngôn ngữ lập trình Java. Tương đương trong C / C ++ là lớp ANativeWindow, được Android NDK tiếp xúc một phần. Bạn có thể lấy ANativeWindow từ một bề mặt bằng lệnh gọi ANativeWindow_fromSurface()
. Cũng giống như người anh em họ ngôn ngữ Java của nó, bạn có thể khóa nó, hiển thị trong phần mềm và mở khóa và đăng. Loại cửa sổ gốc cơ bản là phía sản xuất của BufferQueue.
Để tạo một bề mặt cửa sổ EGL từ mã gốc, hãy chuyển một phiên bản của EGLNativeWindowType tới eglCreateWindowSurface()
. EGLNativeWindowType là một từ đồng nghĩa với ANativeWindow, vì vậy bạn có thể truyền cái này sang cái kia.