Đồ họa

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

Khung công tác 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õ về 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.

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

Các 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 đệm thường được sử dụng bởi SurfaceFlinger. 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 có thể nhìn thấy được hiển thị được kết hợp vào màn hình bởi SurfaceFlinger.

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

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

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

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

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

Một 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 để tiêu dùng. Các ví dụ bao gồm bộ giải mã video OpenGL ES, Canvas 2D và máy chủ trung gian.

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

Người tiêu dùng phổ biến nhất của các luồng hình ảnh là SurfaceFlinger, dịch vụ hệ thống sử dụng các bề mặt hiện có thể nhìn thấy và tổng hợp chúng trê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 máy ảnh. Các ứng dụng không phải GL cũng có thể là người tiêu dùng, ví dụ như lớp ImageReader.

Nhà soạn nhạc phần cứng

Tóm tắt phần cứng cho hệ thống con hiển thị. SurfaceFlinger có thể ủy quyền một số công việc thành phần nhất định cho Hardware Composer để 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 kết 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 công suất tổng hợp thấp hơn so với việc GPU tiến hành tất cả các tính toán.

Phần cứng Composer HAL tiến hành nửa công việc còn lại và là điểm trung tâm cho tất cả các kết xuất đồ họa Android. Phần cứng Composer 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ợ plug-and-playHDMI).

Gralloc

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

Dòng dữ liệu

Xem sơ đồ sau để biết mô tả về đường ống đồ họ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à trình kết xuất tạo ra 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.

BufferQueue

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ỳ không đổi của bộ đệm từ nhà sản xuất đến người tiêu dùng. Sau khi nhà sản xuất loại bỏ bộ đệm của họ, SurfaceFlinger chịu trách nhiệm tổng hợp mọi thứ vào màn hình.

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

Quy 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 lại với nhau. Một số ví dụ về các nhà sản xuất hình ảnh là các bản xem trước máy ảnh được tạo ra bởi các trò chơi HAL hoặc OpenGL ES của máy ảnh. Một số ví dụ về người tiêu 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 một vùng đệm với một hàng đợi và sử dụng Binder IPC để chuyển các bộ đệm giữa các quy trình. Giao diện 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à IGraphicBufferProductioner (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, trong số các tác vụ khác.

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

Chế độ giống như đồng bộ - BufferQueue theo mặc định hoạt động ở chế độ giống như đồng bộ, trong đó mọi bộ đệm đi vào 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 bộ đệm nhanh hơn tốc độ chúng đang được thoát ra, nó sẽ chặn và chờ các bộ đệm miễn phí.

Chế độ không chặn - BufferQueue cũng có thể hoạt động ở chế độ không chặn khi 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 những phụ thuộc phức tạp của khung đồ họa.

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

Để tiến hành 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 kết 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.

Phần cứng Composer HAL tiến hành 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ả các kết xuất đồ họa Android.