
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
. Canvas
có các phương thức vẽ máy tính tiêu 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ài nguyên.
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)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ả dưới đây:
Trình tạo luồng hình ảnh
Trình tạo luồng hình ảnh có thể là bất kỳ đối tượng nào tạo 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 để 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 Trình tổng hợp phần cứng để 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.
HAL của Trình soạn thảo 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ạ trên Android. Trình tổng hợp phần cứng phải hỗ trợ các sự kiện, trong đó có VSYNC (một sự kiện khác là hotplug để hỗ trợ tính năng cắm và phát HDMI).
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 Gralloc HAL.
Luồng dữ liệu
Hãy xem sơ đồ sau đây để biết nội dung 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à Hardware Composer là trình soạn nhạc.
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.
Hãy xem sơ đồ sau đây để biết 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 cho một Surface và tiêu thụ bằng một GL Consumer, cùng với các tác vụ khác.
BufferQueue có thể hoạt động ở 3 chế độ:
Chế độ giống đồng bộ – Theo mặc định, BufferQueue hoạt động ở chế độ giống đồng bộ, trong đó mọi vùng đệm đến từ nhà sản xuất sẽ chuyển đến người tiêu dùng. Không có vùng đệm nào bị loại bỏ trong chế độ này. Và nếu trình tạo quá nhanh và tạo vùng đệm nhanh hơn tốc độ tiêu thụ, thì trình tạo sẽ chặn và chờ vùng đệm trống.
Chế độ không chặn – BufferQueue cũng có thể hoạt động ở chế độ không chặn, trong đó nó sẽ tạo lỗi thay vì chờ bộ đệm trong những trường hợp đó. Chế độ này cũng không loại bỏ bất kỳ vùng đệm nào. Điều này rất hữu ích để tránh các tắc nghẽn tiềm ẩn trong phần mềm ứng dụng có thể không hiểu được các phần phụ thuộc phức tạp của khung đồ hoạ.
Chế độ loại bỏ – Cuối cùng, bạn có thể định cấu hình BufferQueue để loại bỏ các vùng đệm cũ thay vì tạo lỗi hoặc chờ. Ví dụ: nếu thực hiện kết xuất GL vào chế độ xem kết cấu và vẽ nhanh nhất có thể, bạn phải thả vùng đệm.
Để 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í dụ: khi SurfaceFlinger đang chủ động kết hợp một hoặc hai vùng đệm vào vùng đệm thứ ba, thì SurfaceFlinger đ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.