EGLSurface và OpenGL ES

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 cửa sổ cho hoạt động kết xuất GLES, Android sử dụng thư viện EGL. Lệnh gọi GLES kết xuất các đa giác có kết cấu, trong khi lệnh gọi EGL đặt kết xuất trên màn hình.

Trước khi vẽ bằng GLES, bạn cần tạo một ngữ 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ộ nhớ cục bộ của 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, chứ không phải luồng giao diện người dùng.

EGLSurfaces

EGLSurface có thể là 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 nền tảng cửa sổ EGL. eglCreateWindowSurface() lấy đối tượng cửa sổ làm đối số, trên Android là một nền tảng. Bề mặt là phía trình tạo của BufferQueue. Người dùng (SurfaceView, SurfaceTexture, TextureView hoặc ImageReader) tạo các nền tảng. 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 của đối tượng cửa sổ. Từ thời điểm đó trở đi, việc kết xuất đến EGLSurface đó sẽ dẫn đến việc vùng đệm được loại bỏ khỏi hàng đợi, kết xuất vào và được đưa vào hàng đợi để người dùng sử dụng.

EGL không cung cấp lệnh gọi khoá/mở khoá. Phát lệnh vẽ rồi gọi eglSwapBuffers() để gửi khung hiện tại. Tên phương thức này bắt nguồn từ việc hoán đổi vùng đệm trước và sau theo cách truyền thống, nhưng cách triển khai thực tế có thể khác.

Mỗi lần chỉ có thể liên kết một EGLSurface với một nền tảng (bạn chỉ có thể có một nhà sản xuất kết nối với một 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 nền tảng 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 nội dung hiện tại. Mỗi lần, EGLSurface chỉ được hiện trên một luồng.

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 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 nền tảng và bạn có thể sử dụng một nền tảng mà không cần EGL. EGLSurface chỉ cung cấp cho GLES một vị trí để 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 giao diện 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 hiển thị một phần. Bạn có thể lấy ANativeWindow từ một nền tảng bằng lệnh gọi ANativeWindow_fromSurface(). Giống như người anh em ngôn ngữ Java, bạn có thể khoá, kết xuất trong phần mềm và 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 nền tảng cửa sổ EGL từ mã gốc, hãy truyền một thực thể của EGLNativeWindowType đến eglCreateWindowSurface(). EGLNativeWindowType là từ đồng nghĩa với ANativeWindow, vì vậy, bạn có thể truyền một đối tượng sang đối tượng khác.