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