EGLSufaces và OpenGL ES

Android sử dụng API OpenGL ES (GLES) để hiển thị đồ họa. Để tạo ngữ cảnh GLES và cung cấp hệ thống cửa sổ cho kết xuất GLES, Android sử dụng thư viện EGL . Lệnh gọi GLES hiển thị đa giác có kết cấu, trong khi lệnh gọi EGL đưa kết xuất lên màn hình.

Trước khi 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 EGLContext và 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ộ lưu trữ 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 luồng GLES hiện tại, không phải luồng UI.

Bề mặt EGL

EGLSurface có thể là bộ đệm ngoài màn hình được EGL phân bổ, được gọi là pbuffer hoặc một cửa sổ được hệ điều hành phân bổ. 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ố, đối tượng này trên Android là một bề mặt. Bề mặt là phía sản xuất của BufferQueue. Người tiêu dùng , đó là SurfaceView, SurfaceTexture, TextView 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 sản xuất của BufferQueue của đối tượng cửa sổ. Từ thời điểm đó trở đi, việc hiển thị trên EGLSurface đó dẫn đến bộ đệm bị loại bỏ, hiển thị vào và xếp hàng đợi để 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 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ừ sự 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.

Tại một thời điểm, chỉ có thể liên kết một EGLSurface với một bề mặt (bạn chỉ có thể có một nhà sản xuất được kết nối với BufferQueue), nhưng nếu bạn hủy EGLSurface thì nó sẽ ngắt kết nối khỏi BufferQueue và cho phép một 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 nội dung . Một EGLSurface chỉ được hiện hành 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 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 với Android để biết các yêu cầu về OpenGL ES và EGL.

ANativeWindow

Lớp bề mặt công khai được triển khai bằng ngôn ngữ lập trình Java. Lớp tương đương trong C/C++ là lớp ANativeWindow, được Android NDK cung cấp 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() . Giống như người anh em ngôn ngữ Java của nó, bạn có thể khóa nó, hiển thị trong phần mềm cũng như mở khóa 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 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à từ đồng nghĩa với ANativeWindow, vì vậy bạn có thể chuyển cái này sang cái khác.