
Khung Android cung cấp nhiều API kết xuất đồ hoạ cho 2D và 3D tương tác với cách triển khai trình điều khiển đồ hoạ của nhà sản xuất. Vì vậy, điều quan trọng là bạn phải hiểu rõ cách hoạt động của các API đó ở cấp cao hơn. Trang này giới thiệu lớp trừu tượng phần cứng đồ hoạ (HAL) mà các trình điều khiển đó được xây dựng dựa trên đó. Trước khi tiếp tục phần này, hãy làm quen với các thuật ngữ sau:
Canvas
(thành phần API)Surface
. Lớp Canvas
có các phương thức để vẽ máy tính chuẩn của bitmap, đường kẻ, hình tròn, hình chữ nhật, văn bản, v.v. và được liên kết với bitmap hoặc bề mặt. Canvas là cách đơn giản và dễ dàng nhất để vẽ các đối tượng 2D trên màn hình. Lớp cơ sở là Canvas
.
android.graphics.drawable
.
Để biết thêm thông tin về đối tượng có thể vẽ và các tài nguyên khác, hãy xem phần Tổng quan về tài nguyên ứng dụng.
android.opengl
và javax.microedition.khronos.opengles
hiển thị chức năng OpenGL ES.Surface
(thành phần API)Surface
. Sử dụng lớp SurfaceView
thay vì lớp Surface
.
SurfaceView
(thành phần API)View
bao bọc đối tượng Surface
để vẽ và hiển thị các phương thức để chỉ định kích thước và định dạng của đối tượng một cách linh động. Chế độ xem giao diện cung cấp một cách để vẽ độc lập với luồng giao diện người dùng cho các thao tác tốn nhiều tài nguyên, chẳng hạn như trò chơi hoặc bản xem trước của máy ảnh, nhưng do đó, chế độ xem này sẽ sử dụng thêm bộ nhớ. Chế độ xem bề mặt hỗ trợ cả canvas và đồ hoạ OpenGL ES. Lớp cơ sở cho đối tượng SurfaceView
là SurfaceView
.
R.style
và có tiền tố là Theme_
.View
(thành phần API)View
là lớp cơ sở cho hầu hết các thành phần bố cục của một hoạt động hoặc màn hình hộp thoại, chẳng hạn như hộp văn bản và cửa sổ. Đối tượng View
nhận các lệnh gọi từ đối tượng mẹ (xem ViewGroup
) để tự vẽ và thông báo cho đối tượng mẹ về kích thước và vị trí ưu tiên của đối tượng đó. Đối tượng mẹ có thể không tuân thủ kích thước và vị trí đó. Để biết thêm thông tin, hãy xem View
.
ViewGroup
(thành phần API)android.widget
, nhưng mở rộng lớp ViewGroup
.
android.widget
. Window
(thành phần API)Window
. Lớp này chỉ định các phần tử của một cửa sổ chung, chẳng hạn như giao diện, văn bản trên thanh tiêu đề, vị trí và nội dung của trình đơn. Hộp thoại và hoạt động sử dụng cách triển khai lớp Window
để hiển thị đối tượng Window
. Bạn không cần triển khai lớp Window
hoặc sử dụng cửa sổ trong ứng dụng.Nhà phát triển ứng dụng vẽ hình ảnh lên màn hình theo 3 cách: bằng Canvas, OpenGL ES hoặc Vulkan.
Thành phần đồ hoạ Android
Bất kể nhà phát triển sử dụng API kết xuất nào, mọi thứ đều được kết xuất lên một bề mặt. Bề mặt đại diện cho phía nhà sản xuất của hàng đợi vùng đệm mà SurfaceFlinger thường sử dụng. Mọi cửa sổ được tạo trên nền tảng Android đều được hỗ trợ bởi một nền tảng. Tất cả các bề mặt hiển thị được kết xuất đều được SurfaceFlinger kết hợp trên màn hình.
Sơ đồ sau đây cho thấy cách các thành phần chính hoạt động cùng nhau:
Hình 1. Cách kết xuất các nền tảng.
Các thành phần chính được mô tả trong các phần sau.
Trình tạo luồng hình ảnh
Trình tạo luồng hình ảnh có thể là bất kỳ nội dung nào tạo ra vùng đệm đồ hoạ để sử dụng. Ví dụ: OpenGL ES, Canvas 2D và bộ giải mã video mediaserver.
Người dùng luồng hình ảnh
Người dùng phổ biến nhất của luồng hình ảnh là SurfaceFlinger, dịch vụ hệ thống sử dụng các nền tảng hiện đang hiển thị và kết hợp các nền tảng đó trên màn hình bằng thông tin do Trình quản lý cửa sổ cung cấp. SurfaceFlinger là dịch vụ duy nhất có thể sửa đổi nội dung của màn hình. SurfaceFlinger sử dụng OpenGL và Trình tổng hợp phần cứng (HWC) để tổng hợp một nhóm nền tảng.
Các ứng dụng OpenGL ES khác cũng có thể sử dụng luồng hình ảnh, chẳng hạn như ứng dụng máy ảnh sử dụng luồng hình ảnh xem trước của máy ảnh. Các ứng dụng không phải GL cũng có thể là người dùng, ví dụ: lớp ImageReader.
Trình soạn nhạc phần cứng
Phần trừu tượng phần cứng cho hệ thống hiển thị phụ. SurfaceFlinger có thể uỷ quyền một số công việc kết hợp nhất định cho HWC để giảm tải công việc từ OpenGL và GPU. SurfaceFlinger chỉ đóng vai trò là một ứng dụng OpenGL ES khác. Vì vậy, khi SurfaceFlinger đang chủ động kết hợp một hoặc hai vùng đệm vào vùng đệm thứ ba, chẳng hạn như đang sử dụng OpenGL ES. Điều này giúp giảm mức tiêu thụ điện năng khi kết hợp so với việc GPU thực hiện tất cả các phép tính.
Hardware Composer HAL (HAL Trình tổng hợp phần cứng) thực hiện nửa công việc còn lại và là điểm trung tâm cho tất cả hoạt động kết xuất đồ hoạ Android. HWC phải hỗ trợ các sự kiện, trong đó có VSync (một sự kiện khác là hotplug để hỗ trợ HDMI cắm và chạy).
Gralloc
Bạn cần có trình phân bổ bộ nhớ đồ hoạ (Gralloc) để phân bổ bộ nhớ mà trình tạo hình ảnh yêu cầu. Để biết thông tin chi tiết, hãy xem phần BufferQueue và Gralloc.
Luồng dữ liệu
Sơ đồ sau đây mô tả quy trình đồ hoạ Android:
Hình 2. Luồng dữ liệu đồ hoạ thông qua Android.
Các đối tượng ở bên trái là trình kết xuất tạo vùng đệm đồ hoạ, chẳng hạn như màn hình chính, thanh trạng thái và giao diện người dùng hệ thống. SurfaceFlinger là trình kết hợp và HWC là trình kết hợp.
BufferQueue
BufferQueues cung cấp liên kết giữa các thành phần đồ hoạ Android. Đây là một cặp hàng đợi dàn xếp chu kỳ liên tục của vùng đệm từ trình tạo đến trình tiêu thụ. Sau khi các nhà sản xuất chuyển vùng đệm, SurfaceFlinger sẽ chịu trách nhiệm kết hợp mọi thứ trên màn hình.
Sơ đồ sau đây minh hoạ quy trình giao tiếp BufferQueue:
Hình 3. Quy trình giao tiếp BufferQueue.
BufferQueue chứa logic liên kết trình tạo luồng hình ảnh và trình tiêu thụ luồng hình ảnh với nhau. Một số ví dụ về trình tạo hình ảnh là bản xem trước của máy ảnh do HAL máy ảnh hoặc trò chơi OpenGL ES tạo ra. Một số ví dụ về trình sử dụng hình ảnh là SurfaceFlinger hoặc một ứng dụng khác hiển thị luồng OpenGL ES, chẳng hạn như ứng dụng máy ảnh hiển thị kính ngắm máy ảnh.
BufferQueue là một cấu trúc dữ liệu kết hợp nhóm bộ đệm với hàng đợi và sử dụng Binder IPC để truyền bộ đệm giữa các quy trình. Giao diện nhà sản xuất hoặc nội dung bạn truyền cho người muốn tạo vùng đệm đồ hoạ là IGraphicBufferProducer
(một phần của SurfaceTexture
). BufferQueue thường được dùng để kết xuất đến một Surface và tiêu thụ bằng một Consumer GL, cùng với các tác vụ khác.
BufferQueue có thể hoạt động ở 3 chế độ:
Để thực hiện hầu hết công việc này, SurfaceFlinger chỉ đóng vai trò là một ứng dụng OpenGL ES khác. Vì vậy, khi SurfaceFlinger đang chủ động kết hợp một hoặc hai vùng đệm vào vùng đệm thứ ba, chẳng hạn như đang sử dụng OpenGL ES.
HAL của Trình tổng hợp phần cứng thực hiện nửa công việc còn lại. HAL này đóng vai trò là trung tâm cho tất cả hoạt động kết xuất đồ hoạ trên Android.