Những điều mọi nhà phát triển nên biết về các nền tảng, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger và Vulkan.
Trang này mô tả các thành phần thiết yếu của cấu trúc đồ hoạ cấp hệ thống Android và cách khung ứng dụng và hệ thống đa phương tiện sử dụng các thành phần đó. Trọng tâm là cách các vùng đệm của dữ liệu đồ hoạ di chuyển qua hệ thống. Nếu bạn từng thắc mắc tại sao SurfaceView và TextureView lại hoạt động như vậy, hoặc cách các nền tảng và EGLSurface tương tác với nhau, thì bạn đã tìm đúng chỗ.
Giả định rằng bạn đã làm quen với một số thiết bị Android và phát triển ứng dụng. Bạn không cần kiến thức chi tiết về khung ứng dụng và rất ít lệnh gọi API được đề cập, nhưng tài liệu này không trùng lặp với tài liệu công khai khác. Mục tiêu là cung cấp thông tin chi tiết về các sự kiện quan trọng liên quan đến việc kết xuất khung cho đầu ra để giúp bạn đưa ra lựa chọn sáng suốt khi thiết kế ứng dụng. Để đạt được điều này, chúng ta làm việc từ dưới lên, mô tả cách các lớp giao diện người dùng hoạt động thay vì cách sử dụng các lớp đó.
Phần này bao gồm một số trang trình bày mọi thứ, từ tài liệu nền đến thông tin chi tiết về HAL cho đến các trường hợp sử dụng. Bài viết bắt đầu bằng phần giải thích về vùng đệm đồ hoạ Android, mô tả cơ chế hiển thị và thành phần hiển thị, sau đó chuyển sang các cơ chế cấp cao hơn cung cấp dữ liệu cho trình kết hợp. Bạn nên đọc các trang theo thứ tự được liệt kê bên dưới thay vì chuyển sang một chủ đề nghe có vẻ thú vị.
Thành phần cấp thấp
- BufferQueue và gralloc. BufferQueue kết nối một thành phần tạo vùng đệm dữ liệu đồ hoạ (trình tạo) với một thành phần chấp nhận dữ liệu để hiển thị hoặc xử lý thêm (trình dùng). Việc phân bổ vùng đệm được thực hiện thông qua trình phân bổ bộ nhớ gralloc được triển khai thông qua giao diện HAL dành riêng cho nhà cung cấp.
- SurfaceFlinger, Hardware Composer và màn hình ảo. SurfaceFlinger chấp nhận các vùng đệm dữ liệu từ nhiều nguồn, kết hợp các vùng đệm đó và gửi đến màn hình. HAL (HWC) của Trình tổng hợp phần cứng xác định cách hiệu quả nhất để kết hợp các vùng đệm với phần cứng hiện có và màn hình ảo cung cấp đầu ra kết hợp trong hệ thống (ghi màn hình hoặc gửi màn hình qua mạng).
- Surface, canvas và SurfaceHolder. Một nền tảng tạo ra hàng đợi bộ đệm thường được SurfaceFlinger sử dụng. Khi kết xuất lên một nền tảng, kết quả sẽ kết thúc trong một vùng đệm được gửi đến người dùng. API Canvas cung cấp phương thức triển khai phần mềm (có hỗ trợ tăng tốc phần cứng) để vẽ trực tiếp trên một nền tảng (phương án thay thế cấp thấp cho OpenGL ES). Mọi thứ liên quan đến thành phần hiển thị đều liên quan đến SurfaceHolder, các API của SurfaceHolder cho phép lấy và đặt các tham số bề mặt như kích thước và định dạng.
- EGLSurface và OpenGL ES. OpenGL ES (GLES) xác định một API kết xuất đồ hoạ được thiết kế để kết hợp với EGL, một thư viện có thể tạo và truy cập vào các cửa sổ thông qua hệ điều hành (để vẽ đa giác có kết cấu, hãy sử dụng lệnh gọi GLES; để hiển thị kết xuất trên màn hình, hãy sử dụng lệnh gọi EGL). Trang này cũng đề cập đến ANativeWindow, tương đương với C/C++ của lớp Surface Java dùng để tạo một nền tảng cửa sổ EGL từ mã gốc.
- Vulkan. Vulkan là một API nhiều nền tảng, mức hao tổn thấp dành cho đồ hoạ 3D hiệu suất cao. Giống như OpenGL ES, Vulkan cung cấp các công cụ để tạo đồ hoạ chất lượng cao, theo thời gian thực trong các ứng dụng. Vulkan có các lợi thế như giảm mức hao tổn CPU và hỗ trợ ngôn ngữ SPIR-V Binary Intermediate.
Thành phần cấp cao
- SurfaceView và GLSurfaceView. SurfaceView kết hợp một nền tảng và một thành phần hiển thị. Các thành phần hiển thị của SurfaceView được kết hợp bởi SurfaceFlinger (chứ không phải ứng dụng), cho phép hiển thị từ một luồng/quy trình riêng biệt và tách biệt với hoạt động hiển thị giao diện người dùng của ứng dụng. GLSurfaceView cung cấp các lớp trợ giúp để quản lý ngữ cảnh EGL, giao tiếp giữa luồng và tương tác với vòng đời hoạt động (nhưng không bắt buộc phải sử dụng GLES).
- SurfaceTexture. SurfaceTexture kết hợp một bề mặt và hoạ tiết GLES để tạo một BufferQueue mà ứng dụng của bạn là người dùng. Khi một nhà sản xuất đưa một vùng đệm mới vào hàng đợi, nhà sản xuất đó sẽ thông báo cho ứng dụng của bạn. Ứng dụng này sẽ giải phóng vùng đệm đã giữ trước đó, lấy vùng đệm mới từ hàng đợi và thực hiện lệnh gọi EGL để cung cấp vùng đệm cho GLES dưới dạng hoạ tiết bên ngoài. Android 7.0 đã thêm tính năng hỗ trợ phát video kết cấu bảo mật, cho phép GPU xử lý hậu kỳ nội dung video được bảo vệ.
- TextureView. TextureView kết hợp một thành phần hiển thị với SurfaceTexture. TextureView gói một SurfaceTexture và chịu trách nhiệm phản hồi các lệnh gọi lại cũng như thu nạp các vùng đệm mới. Khi vẽ, TextureView sử dụng nội dung của vùng đệm nhận được gần đây nhất làm nguồn dữ liệu, hiển thị ở bất cứ đâu và bất kể trạng thái chế độ xem cho biết điều gì. Cấu trúc thành phần hiển thị luôn được thực hiện bằng GLES, nghĩa là nội dung cập nhật cũng có thể khiến các thành phần hiển thị khác vẽ lại.