Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

BufferQueue và Gralloc

Lớp BufferQueue kết nối các thành phần tạo bộ đệm dữ liệu đồ họa ( nhà sản xuất ) với các thành phần chấp nhận dữ liệu để hiển thị hoặc xử lý thêm ( người tiêu dùng ). Gần như mọi thứ di chuyển bộ đệm dữ liệu đồ họa thông qua hệ thống đều dựa vào BufferQueue.

Bộ cấp phát bộ nhớ Gralloc thực hiện cấp phát bộ đệm và được thực hiện thông qua hai giao diện HIDL dành riêng cho nhà cung cấp (xem hardware/interfaces/graphics/allocator/hardware/interfaces/graphics/mapper/ ). Hàm allocate() nhận các đối số dự kiến ​​(chiều rộng, chiều cao, định dạng pixel) cũng như một tập hợp các cờ sử dụng.

Nhà sản xuất và người tiêu dùng BufferQueue

Người tiêu dùng tạo và sở hữu cấu trúc dữ liệu BufferQueue và có thể tồn tại trong các quy trình khác với nhà sản xuất của họ. Khi một nhà sản xuất cần một bộ đệm, nó sẽ yêu cầu một bộ đệm miễn phí từ BufferQueue bằng cách gọi dequeueBuffer() , chỉ định chiều rộng, chiều cao, định dạng pixel và cờ sử dụng của bộ đệm. Sau đó, nhà sản xuất điền vào bộ đệm và trả bộ đệm vào hàng đợi bằng cách gọi queueBuffer() . Tiếp theo, người tiêu dùng có được bộ đệm bằng acquireBuffer() và sử dụng nội dung bộ đệm. Khi người tiêu dùng thực hiện xong, nó trả về bộ đệm cho hàng đợi bằng cách gọi releaseBuffer() . Khung đồng bộ kiểm soát cách bộ đệm di chuyển qua đường dẫn đồ họa Android.

Một số đặc điểm của BufferQueue, chẳng hạn như số lượng bộ đệm tối đa mà nó có thể chứa, được xác định chung bởi nhà sản xuất và người tiêu dùng. Tuy nhiên, BufferQueue phân bổ bộ đệm khi nó cần. Bộ đệm được giữ lại trừ khi các đặc tính thay đổi; ví dụ: nếu nhà sản xuất yêu cầu bộ đệm có kích thước khác, bộ đệm cũ được giải phóng và bộ đệm mới được phân bổ theo yêu cầu.

Nội dung bộ đệm không bao giờ được sao chép bởi BufferQueue, vì việc di chuyển nhiều dữ liệu xung quanh là không hiệu quả. Thay vào đó, bộ đệm luôn được chuyển qua bởi một tay cầm.

Theo dõi BufferQueue với Systrace

Để hiểu cách bộ đệm đồ họa di chuyển xung quanh, hãy sử dụng Systrace , một công cụ ghi lại hoạt động của thiết bị trong một khoảng thời gian ngắn. Mã đồ họa cấp hệ thống được thiết kế tốt, cũng như phần lớn mã khung ứng dụng có liên quan.

Để sử dụng Systrace, hãy bật các thẻ gfx , view và lên sched . Các đối tượng BufferQueue được hiển thị trong dấu vết. Ví dụ: nếu bạn theo dõi trong khi Play video (SurfaceView) của Grafika đang chạy, hàng có nhãn SurfaceView cho bạn biết có bao nhiêu bộ đệm đã được xếp hàng vào bất kỳ thời điểm nhất định nào.

Giá trị tăng lên trong khi ứng dụng đang hoạt động, điều này kích hoạt hiển thị khung hình bởi bộ giải mã MediaCodec. Giá trị giảm trong khi SurfaceFlinger đang hoạt động và sử dụng bộ đệm. Khi hiển thị video ở tốc độ 30 khung hình / giây, giá trị của hàng đợi thay đổi từ 0 đến 1 vì màn hình ~ 60 khung hình / giây có thể theo kịp nguồn. SurfaceFlinger chỉ thức dậy khi có việc phải hoàn thành, không phải 60 lần mỗi giây. Hệ thống cố gắng tránh công việc và tắt VSYNC nếu không có gì đang cập nhật màn hình.

Nếu bạn chuyển sang Play video (TextureView) của Grafika và lấy một dấu vết mới, bạn sẽ thấy một hàng có nhãn com.android.grafika / com.android.grafika.PlayMovieActivity . Đây là lớp giao diện người dùng chính, là một BufferQueue khác. Bởi vì TextureView hiển thị trong lớp giao diện người dùng chứ không phải một lớp riêng biệt, tất cả các bản cập nhật theo hướng video đều được hiển thị ở đây.

Gralloc

Bộ phân bổ Gralloc HAL hardware/libhardware/include/hardware/gralloc.h thực hiện cấp phát bộ đệm thông qua các cờ sử dụng. Cờ sử dụng bao gồm các thuộc tính như:

  • Tần suất bộ nhớ sẽ được truy cập từ phần mềm (CPU)
  • Tần suất bộ nhớ sẽ được truy cập từ phần cứng (GPU)
  • Liệu bộ nhớ có được sử dụng làm kết cấu OpenGL ES (GLES) hay không
  • Liệu bộ nhớ có được bộ mã hóa video sử dụng hay không

Ví dụ: nếu định dạng bộ đệm của nhà sản xuất chỉ định RGBA_8888 pixel và nhà sản xuất cho biết rằng bộ đệm sẽ được truy cập từ phần mềm (nghĩa là một ứng dụng sẽ chạm vào các pixel trên CPU), Gralloc sẽ tạo bộ đệm với 4 byte mỗi pixel theo thứ tự RGBA. Nếu thay vào đó, nhà sản xuất chỉ định bộ đệm của nó sẽ chỉ được truy cập từ phần cứng và như một kết cấu GLES, Gralloc có thể làm bất cứ điều gì mà trình điều khiển GLES muốn, chẳng hạn như thứ tự BGRA, bố cục xoay phi tuyến tính và định dạng màu thay thế. Cho phép phần cứng sử dụng định dạng ưa thích của nó có thể cải thiện hiệu suất.

Một số giá trị không thể được kết hợp trên một số nền tảng nhất định. Ví dụ: cờ bộ mã hóa video có thể yêu cầu pixel YUV, do đó, việc thêm quyền truy cập phần mềm và chỉ định RGBA_8888 không thành công.

Tay cầm do Gralloc trả về có thể được chuyển giữa các quá trình thông qua Binder.

Bộ đệm được bảo vệ

Cờ sử dụng GRALLOC_USAGE_PROTECTED cho phép bộ đệm đồ họa chỉ được hiển thị thông qua một đường dẫn được bảo vệ bằng phần cứng. Các mặt phẳng lớp phủ này là cách duy nhất để hiển thị nội dung DRM (SurfaceFlinger hoặc trình điều khiển OpenGL ES không thể truy cập bộ đệm được bảo vệ bằng DRM).

Video được bảo vệ bằng DRM chỉ có thể được trình bày trên mặt phẳng lớp phủ. Trình phát video hỗ trợ nội dung được bảo vệ phải được triển khai bằng SurfaceView. Phần mềm chạy trên phần cứng không được bảo vệ không thể đọc hoặc ghi bộ đệm; các đường dẫn được bảo vệ bằng phần cứng phải xuất hiện trên lớp phủ Hardware Composer (nghĩa là các video được bảo vệ sẽ biến mất khỏi màn hình nếu Hardware Composer chuyển sang thành phần OpenGL ES).

Để biết chi tiết về nội dung được bảo vệ, hãy xem DRM .