Cấu trúc đồ hoạ

Những điều mà 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 cũng như hệ thống đa phương tiện sử dụng các thành phần này. Trọng tâm là cách các vùng đệm dữ liệu đồ hoạ di chuyển qua hệ thống. Nếu từng thắc mắc về lý do SurfaceView và TextureView hoạt động theo cách mà chúng đang hoạt động, hoặc cách các nền tảng và EGLSurface tương tác, thì bạn đã đến đúng nơi.

Bạn cần có kiến thức cơ bản về thiết bị Android và việc phát triển ứng dụng. Bạn không cần có 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 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 một khung hình để xuất ra, giúp bạn đưa ra lựa chọn sáng suốt khi thiết kế một ứng dụng. Để đạt được mục tiêu này, tài liệu này sẽ trình bày 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 chúng có thể được sử dụng.

Phần này bao gồm một số trang đề cập đến mọi thứ, từ tài liệu cơ bản đến thông tin chi tiết về HAL và các trường hợp sử dụng. Phần này bắt đầu bằng việc giải thích về các vùng đệm đồ hoạ Android, mô tả cơ chế kết hợp và 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ự sau thay vì bỏ qua để chuyển đến một chủ đề mà bạn thấy 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ạ (producer) với một thành phần chấp nhận dữ liệu để hiển thị hoặc xử lý thêm (consumer). 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 chúng và gửi đến màn hình. HAL Trình kết hợp phần cứng (HWC) xác định cách kết hợp các vùng đệm hiệu quả nhất bằng 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 lại màn hình hoặc gửi màn hình qua mạng).
  • Surface, canvas và SurfaceHolder. Một vùng hiển thị tạo ra hàng đợi bộ nhớ đệm thường được SurfaceFlinger sử dụng. Khi kết xuất trên một bề mặt, kết quả sẽ nằm trong một vùng đệm được chuyển đến người dùng. Các API Canvas cung cấp một 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 bề mặt (giải pháp thay thế cấp thấp cho OpenGL ES). Mọi thứ liên quan đến khung hiển thị đều liên quan đến một SurfaceHolder, API của SurfaceHolder cho phép nhận và đặt các tham số của vùng hiển thị, chẳng hạn 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ẽ các đa giác có kết cấu, hãy sử dụng lệnh gọi GLES; để đặt quá trình 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 C/C++ của lớp Surface Java dùng để tạo một bề mặt cửa sổ EGL từ mã gốc.
  • Vulkan. Vulkan là một API nhiều nền tảng có 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ó những lợi thế như giảm mức hao tổn 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 nền tảng và một khung hiển thị. Các thành phần hiển thị của SurfaceView được SurfaceFlinger kết hợp (chứ không phải ứng dụng), cho phép kết xuất từ một luồng/tiến trình riêng biệt và tách biệt với quá trình kết xuất 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 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).
  • SurfaceTexture. SurfaceTexture kết hợp một bề mặt và một kết cấu GLES để tạo BufferQueue mà ứng dụng của bạn là người dùng. Khi một nhà sản xuất xếp hàng một vùng đệm mớ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 các lệnh gọi EGL để cung cấp vùng đệm cho GLES dưới dạng một hoạ tiết bên ngoài. Android 7.0 đã thêm tính năng hỗ trợ phát video có 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 khung hiển thị với một SurfaceTexture. TextureView 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 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, kết xuất ở bất cứ nơi nào và theo bất cứ cách nào mà trạng thái khung hiển thị cho biết. Thành phần hiển thị luôn được kết hợp với GLES, nghĩa là nội dung cập nhật có thể khiến các phần tử thành phần hiển thị khác cũng được vẽ lại.