Đồ hoạ

Biểu tượng HAL đồ họa Android

Khung Android cung cấp nhiều API kết xuất đồ họa cho 2D và 3D tương tác với việc triển khai trình điều khiển đồ họa của nhà sản xuất, vì vậy điều quan trọng là phải hiểu rõ cách các API đó hoạt động ở cấp độ cao hơn. Trang này giới thiệu lớp trừu tượng phần cứng đồ họa (HAL) mà các trình điều khiển đó được xây dựng 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 (thuật ngữ chung), Canvas (phần tử API)
Canvas là một bề mặt vẽ xử lý việc tổng hợp các bit thực tế dựa trên bitmap hoặc đối tượng Surface . Canvas có các phương pháp để vẽ ảnh bitmap, đường thẳng, hình tròn, hình chữ nhật, văn bản, v.v. trên máy tính tiêu chuẩn và được liên kết với một bitmap hoặc bề mặt. Canvas là cách đơn giản nhất, dễ dàng nhất để vẽ các đối tượng 2D trên màn hình. Lớp cơ sở là Canvas .
có thể vẽ được
Đối tượng có thể vẽ là tài nguyên trực quan được biên dịch có thể được sử dụng làm nền, tiêu đề hoặc phần khác của màn hình. Một đối tượng có thể vẽ thường được tải vào một thành phần giao diện người dùng khác, chẳng hạn như dưới dạng hình nền. Một đối tượng có thể vẽ không thể nhận các sự kiện nhưng có thể gán nhiều thuộc tính khác như trạng thái và lập lịch để kích hoạt các lớp con như đối tượng hoạt hình hoặc thư viện hình ảnh. Nhiều đối tượng có thể vẽ được tải từ các tệp tài nguyên có thể vẽ - tệp XML hoặc bitmap mô tả hình ảnh. Tài nguyên có thể vẽ được biên dịch thành các lớp con của android.graphics.drawable . Để biết thêm thông tin về các tài nguyên có thể vẽ và các tài nguyên khác, hãy xem Tài nguyên .
tài nguyên bố cục
Tài nguyên bố cục là một tệp XML mô tả bố cục của màn hình hoạt động. Để biết thêm thông tin, hãy xem Tài nguyên bố cục .
chín bản vá (9 bản vá, NinePatch)
Chín bản vá là tài nguyên bitmap có thể thay đổi kích thước, có thể được sử dụng làm hình nền hoặc hình ảnh khác trên thiết bị. Để biết thêm thông tin, xem Chín bản vá .
OpenGL ES
OpenGL ES là API đa nền tảng để hiển thị đồ họa 2D và 3D. Android cung cấp thư viện OpenGL ES để hiển thị 3D được tăng tốc phần cứng. Để hiển thị 2D, canvas là tùy chọn đơn giản hơn. OpenGL ES có sẵn trong Bộ công cụ phát triển gốc Android (NDK) . Các gói android.opengljavax.microedition.khronos.opengles thể hiện chức năng OpenGL ES.
bề mặt (thuật ngữ chung), Surface (phần tử API)
Một bề mặt đại diện cho một khối bộ nhớ được tổng hợp vào màn hình. Một bề mặt giữ một khung vẽ để vẽ và cung cấp nhiều phương thức trợ giúp khác nhau để vẽ các lớp và thay đổi kích thước đối tượng Surface . Sử dụng trực tiếp lớp SurfaceView thay vì lớp Surface .
chế độ xem bề mặt (thuật ngữ chung), SurfaceView (phần tử API)
Chế độ xem bề mặt là một đối tượng Chế độ View bao bọc một đối tượng Surface để vẽ và hiển thị các phương thức để xác định kích thước và định dạng của nó một cách linh hoạt. Chế độ xem bề mặt cung cấp cách vẽ độc lập với luồng giao diện người dùng cho các hoạt động sử dụng nhiều tài nguyên, chẳng hạn như trò chơi hoặc xem trước máy ảnh, nhưng kết quả là nó sử dụng thêm bộ nhớ. Chế độ xem bề mặt hỗ trợ cả đồ họa canvas và OpenGL ES. Lớp cơ sở cho đối tượng SurfaceViewSurfaceView .
chủ đề
Chủ đề là một tập hợp các thuộc tính, chẳng hạn như kích thước văn bản và màu nền, được nhóm lại với nhau để xác định các cài đặt hiển thị mặc định khác nhau. Android cung cấp một số chủ đề tiêu chuẩn, được liệt kê trong R.style và mở đầu bằng Theme_ .
view (thuật ngữ chung), View (phần tử API)
Chế độ xem vẽ một vùng hình chữ nhật trên màn hình và xử lý thao tác nhấp chuột, nhấn phím và các sự kiện tương tác khác. Lớp View là lớp cơ sở cho hầu hết các thành phần bố cục của màn hình hoạt động hoặc 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 lệnh gọi từ đối tượng cha của nó (xem ViewGroup ) để tự vẽ và thông báo cho đối tượng cha về kích thước và vị trí ưa thích của nó, những điều này có thể không được cha mẹ tôn trọng. Để biết thêm thông tin, xem View .
nhóm xem (thuật ngữ chung), ViewGroup (phần tử API)
Một nhóm dạng xem nhóm một tập hợp các dạng xem con. Nhóm chế độ xem chịu trách nhiệm quyết định vị trí của các chế độ xem con và mức độ lớn của chúng, cũng như kêu gọi mỗi chế độ xem tự vẽ khi thích hợp. Một số nhóm chế độ xem là ẩn và chỉ dành cho bố cục, trong khi những nhóm khác có giao diện người dùng nội tại, chẳng hạn như hộp danh sách cuộn. Các nhóm xem nằm trong gói widget nhưng mở rộng lớp ViewGroup .
xem thứ bậc
Hệ thống phân cấp chế độ xem là sự sắp xếp các đối tượng chế độ xem và nhóm chế độ xem xác định giao diện người dùng cho từng thành phần của ứng dụng. Hệ thống phân cấp bao gồm các nhóm chế độ xem chứa một hoặc nhiều chế độ xem con hoặc nhóm chế độ xem. Bạn có thể có được bản trình bày trực quan về hệ thống phân cấp chế độ xem để gỡ lỗi và tối ưu hóa bằng cách sử dụng Trình xem phân cấp được cung cấp cùng với SDK Android.
Vulkan
Vulkan là API đa nền tảng có chi phí thấp dành cho đồ họa 3D hiệu suất cao.
tiện ích
Tiện ích là một trong tập hợp các lớp con chế độ xem được triển khai đầy đủ để hiển thị các thành phần biểu mẫu và các thành phần giao diện người dùng khác, chẳng hạn như hộp văn bản hoặc menu bật lên. Vì một tiện ích được triển khai đầy đủ nên nó xử lý việc đo lường, tự vẽ và phản hồi các sự kiện trên màn hình. Các widget nằm trong gói android.widget .
cửa sổ (thuật ngữ chung), Window (phần tử API)
Trong ứng dụng Android, cửa sổ là một đối tượng bắt nguồn từ lớp trừu tượng Window dùng để chỉ định các thành phần 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 đề cũng như vị trí và nội dung của menu. Các hộp thoại và hoạt động sử dụng cách triển khai của 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 windows trong ứng dụng của mình.

Các nhà phát triển ứng dụng vẽ hình ảnh lên màn hình theo ba cách: bằng Canvas , OpenGL ES hoặc Vulkan .

Thành phần đồ họa Android

Bất kể nhà phát triển API kết xuất nào sử dụng, mọi thứ đều được hiển thị trê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 bộ đệm thường được SurfaceFlinger 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 bề mặt. Tất cả các bề mặt hiển thị được kết xuất đều được SurfaceFlinger tổng hợp lên màn hình.

Sơ đồ sau đây cho thấy các thành phần chính hoạt động cùng nhau như thế nào:

thành phần kết xuất hình ảnh

Hình 1. Các bề mặt được hiển thị như thế nào.

Các thành phần chính được mô tả dưới đây:

Nhà sản xuất luồng hình ảnh

Nhà sản xuất luồng hình ảnh có thể là bất cứ thứ gì tạo ra bộ đệm đồ họa để sử dụng. Các ví dụ bao gồm bộ giải mã video OpenGL ES, Canvas 2D và mediaserver.

Người tiêu dùng luồng hình ảnh

Ứng dụng sử dụng luồng hình ảnh phổ biến nhất là SurfaceFlinger, dịch vụ hệ thống sử dụng các bề mặt hiện có và tổng hợp chúng lên màn hình bằng cách sử dụ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à Hardware Composer để tạo một nhóm bề mặt.

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 dụng tiêu dùng, chẳng hạn như lớp ImageReader.

Trình soạn thảo phần cứng

Sự trừu tượng hóa phần cứng cho hệ thống con hiển thị. SurfaceFlinger có thể ủy quyền công việc sáng tác nhất định cho Trình soạn thảo phần cứng để giảm tải công việc từ OpenGL và GPU. SurfaceFlinger hoạt động như một ứng dụng khách OpenGL ES khác. Vì vậy, khi SurfaceFlinger đang tích cực tổng hợp một hoặc hai bộ đệm thành một bộ đệm thứ ba, chẳng hạn, nó đang sử dụng OpenGL ES. Điều này làm cho việc tổng hợp năng lượng thấp hơn so với việc GPU thực hiện mọi tính toán.

Hardware Composer HAL thực hiện nửa còn lại của công việc và là điểm trung tâm cho tất cả kết xuất đồ họa của Android. Trình soạn thảo phần cứng phải hỗ trợ các sự kiện, một trong số đó là VSYNC (một sự kiện khác là hotplug để hỗ trợ HDMI plug-and-play).

Gralloc

Cần có bộ cấp phát bộ nhớ đồ họa (Gralloc) để cấp phát bộ nhớ theo yêu cầu của nhà sản xuất hình ảnh. Để biết chi tiết, xem Gralloc HAL .

Dòng dữ liệu

Xem sơ đồ sau để biết mô tả về quy trình đồ họa của Android:

luồng dữ liệu đồ họa

Hình 2. Luồng dữ liệu đồ họa qua Android

Các đối tượng bên trái là các trình kết xuất tạo bộ đệm đồ họa, 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à nhà soạn nhạc và Hardware Composer là nhà soạn nhạc.

Hàng đợi đệm

BufferQueues cung cấp chất kết dính giữa các thành phần đồ họa Android. Đây là một cặp hàng đợi làm trung gian cho chu kỳ đệm liên tục từ nhà sản xuất đến người tiêu dùng. Sau khi nhà sản xuất chuyển giao bộ đệm của họ, SurfaceFlinger chịu trách nhiệm tổng hợp mọi thứ trên màn hình.

Xem sơ đồ sau để biết quy trình giao tiếp BufferQueue.

Quá trình giao tiếp BufferQueue

Hình 3. Quá trình giao tiếp BufferQueue

BufferQueue chứa logic liên kết các nhà sản xuất luồng hình ảnh và người tiêu dùng luồng hình ảnh với nhau. Một số ví dụ về nhà sản xuất hình ảnh là các bản xem trước máy ảnh do trò chơi HAL hoặc OpenGL ES của máy ảnh tạo ra. Một số ví dụ về người 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à cấu trúc dữ liệu kết hợp vùng đệm với hàng đợi và sử dụng Binder IPC để chuyển vùng đệm giữa các tiến trình. Giao diện của nhà sản xuất hoặc những gì bạn chuyển cho ai đó muốn tạo bộ đệm đồ họa là IGraphicBufferProducer (một phần của SurfaceTexture ). BufferQueue thường được sử dụng để hiển thị trên Surface và sử dụng với GL Consumer, cùng với các tác vụ khác.

BufferQueue có thể hoạt động ở ba chế độ khác nhau:

Chế độ giống đồng bộ - BufferQueue theo mặc định hoạt động ở chế độ giống đồng bộ, trong đó mọi bộ đệm đến từ nhà sản xuất sẽ đi ra ngoài ở người tiêu dùng. Không có bộ đệm nào bị loại bỏ trong chế độ này. Và nếu nhà sản xuất quá nhanh và tạo ra bộ đệm nhanh hơn mức chúng bị cạn kiệt, nó sẽ chặn và chờ bộ đệm miễn phí.

Chế độ không chặn - BufferQueue cũng có thể hoạt động ở chế độ không chặn trong đó nó tạo ra lỗi thay vì chờ bộ đệm trong những trường hợp đó. Không có bộ đệm nào bị loại bỏ trong chế độ này. Điều này rất hữu ích để tránh những bế tắc tiềm ẩn trong phần mềm ứng dụng có thể không hiểu được sự phụ thuộc phức tạp của khung đồ họa.

Chế độ loại bỏ - Cuối cùng, BufferQueue có thể được cấu hình để loại bỏ bộ đệm cũ thay vì tạo ra lỗi hoặc chờ đợi. Ví dụ: nếu tiến hành kết xuất GL sang chế độ xem kết cấu và vẽ càng nhanh càng tốt, bộ đệm phải bị loại bỏ.

Để thực hiện hầu hết công việc này, SurfaceFlinger hoạt động như một ứng dụng khách OpenGL ES khác. Vì vậy, khi SurfaceFlinger đang tích cực tổng hợp một hoặc hai bộ đệm thành một bộ đệm thứ ba, chẳng hạn, nó đang sử dụng OpenGL ES.

Nhà soạn nhạc phần cứng HAL thực hiện nửa công việc còn lại. HAL này đóng vai trò là điểm trung tâm cho tất cả kết xuất đồ họa của Android.