Android sử dụng API OpenGL ES (GLES) để kết xuất đồ hoạ. Để tạo bối cảnh GLES và cung cấp hệ thống tạo cửa sổ cho các bản kết xuất GLES, Android sử dụng thư viện EGL. Các lệnh gọi GLES kết xuất các đa giác có kết cấu, trong khi các lệnh gọi EGL đặt các kết xuất trên màn hình.
Trước khi vẽ bằng GLES, bạn phải tạo một ngữ cảnh GL. Trong EGL, điều này có nghĩa là bạn phải tạo một EGLContext và một EGLSurface. Các thao tác GLES áp dụng cho ngữ cảnh hiện tại, được truy cập thông qua bộ nhớ cục bộ theo 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 luồng GLES, chứ không phải luồng giao diện người dùng.
EGLSurface
EGLSurface có thể là một vùng đệm ngoài màn hình do EGL phân bổ, được gọi là pbuffer, hoặc một cửa sổ do hệ điều hành phân bổ. Việc gọi hàm eglCreateWindowSurface()
sẽ tạo ra các bề mặt cửa sổ EGL.
eglCreateWindowSurface()
lấy đối tượng cửa sổ làm đối số. Đây là một vùng hiển thị trên Android. Surface là phía nhà sản xuất của BufferQueue. Người dùng (là SurfaceView, SurfaceTexture, TextureView hoặc ImageReader) tạo ra các bề mặt.
Khi bạn gọi eglCreateWindowSurface()
, EGL sẽ tạo một đối tượng EGLSurface mới và kết nối đối tượng đó với giao diện nhà sản xuất của BufferQueue trong đối tượng cửa sổ. Từ thời điểm đó trở đi, việc kết xuất vào EGLSurface đó sẽ loại bỏ một vùng đệm, kết xuất vào vùng đệm đó và xếp hàng để người dùng sử dụng.
EGL không cung cấp các lệnh gọi khoá/mở khoá. Phát lệnh vẽ rồi gọi eglSwapBuffers()
để gửi khung hình hiện tại. Tên phương thức này bắt nguồn từ việc hoán đổi truyền thống giữa các vùng đệm trước và sau, nhưng cách triển khai thực tế có thể khác.
Chỉ có một EGLSurface có thể được liên kết với một surface tại một thời điểm (bạn chỉ có thể có một nhà sản xuất kết nối với BufferQueue), nhưng nếu bạn huỷ EGLSurface, thì EGLSurface sẽ ngắt kết nối với BufferQueue và cho phép một thành phần khác kết nối.
Một luồng nhất định có thể chuyển đổi giữa nhiều EGLSurface bằng cách thay đổi current. EGLSurface chỉ được phép hoạt động 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 một vùng, chẳng hạn 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 EGLSurface không được hỗ trợ bởi một bề mặt và bạn có thể sử dụng một bề mặt mà không cần EGL. EGLSurface cung cấp cho GLES một nơi để vẽ.
Tham khảo Tài liệu định nghĩa về khả năng tương thích của Android để biết các yêu cầu về OpenGL ES và EGL.
ANativeWindow
Lớp nền tảng công khai được triển khai bằng ngôn ngữ lập trình Java. Tương đương trong C/C++ là lớp ANativeWindow, được Android NDK bán hiển thị. Bạn có thể lấy ANativeWindow từ một vùng hiển thị bằng lệnh gọi ANativeWindow_fromSurface()
. Giống như phiên bản bằng ngôn ngữ Java, bạn có thể khoá, kết xuất trong phần mềm, cũng như mở khoá và đăng. Loại cửa sổ gốc cơ bản là phía nhà sản xuất của BufferQueue.
Để tạo một bề mặt cửa sổ EGL từ mã gốc, hãy truyền một phiên bản EGLNativeWindowType đến eglCreateWindowSurface()
. EGLNativeWindowType là một từ đồng nghĩa với ANativeWindow, vì vậy, bạn có thể truyền một từ đồng nghĩa này sang từ đồng nghĩa khác.