Trong ngăn xếp đồ hoạ, bộ nhớ đệm cho mỗi lớp nằm giữa Composer HAL và SurfaceFlinger để giảm chi phí liên quan đến việc gửi bộ mô tả tệp qua IPC. Trước Android 14, bộ nhớ đệm này không bị xoá khi GraphicBufferProducer
ngắt kết nối khỏi GraphicBufferConsumer
SurfaceFlinger, chẳng hạn như khi MediaCodec bị ngắt kết nối khỏi SurfaceView. Kể từ Android 14, bạn có thể buộc xoá bộ nhớ đệm này để giảm mức tiêu thụ bộ nhớ đồ hoạ.
Chọn một trong hai lựa chọn sau:
- Đối với các thiết bị chạy Android 14 trở lên, bạn phải triển khai Composer HAL API phiên bản 3.2 mới. Tuỳ chọn này được kích hoạt theo mặc định và tiết kiệm bộ nhớ nhất. Các thiết bị nâng cấp lên phiên bản 14 trở lên cũng có thể sử dụng lựa chọn này để tận dụng tối đa lợi ích về bộ nhớ.
- Đối với những thiết bị nâng cấp lên Android 14 mà bạn không muốn triển khai Composer HAL 3.2 API, bạn có thể bật lựa chọn tương thích ngược. Tuỳ chọn này tiết kiệm gần như bằng với tuỳ chọn trước.
Hai phần sau đây giải thích cách triển khai từng lựa chọn.
Triển khai API Composer HAL 3.2
Để khai thác tối đa lợi ích của bộ nhớ đệm đồ hoạ, bạn phải:
- Cập nhật việc triển khai HAL của Composer lên phiên bản 3.2.
- Xử lý
LayerCommand::bufferSlotsToClear
bằng cách xoá các mục trong bộ nhớ đệm được chỉ định bằng số khe cắm có trong danh sách.
Các API Composer HAL 3.2 liên quan đến bộ nhớ đệm đồ hoạ, bao gồm cả LayerCommand:bufferSlotsToClear
, nằm trong LayerCommand.aidl-
.
Bật lựa chọn tương thích ngược
Lựa chọn giảm bộ nhớ tương thích ngược sẽ thay thế vùng đệm thực trong ngăn bộ nhớ đệm bằng vùng đệm giữ chỗ 1x1, giúp tiết kiệm bộ nhớ cho tất cả các ngăn đã bị xoá, ngoại trừ ngăn vùng đệm đang hoạt động hiện tại. Để đạt được một phần lợi ích tiết kiệm bộ nhớ, hãy bật lựa chọn tương thích ngược bằng cách đặt sysprop surface_flinger.clear_slots_with_set_layer_buffer
thành true
. Sysprop này có trong tệp property_contexts
.
Để thiết lập sysprop này, bạn cần triển khai Composer HAL để xử lý chính xác nhiều lệnh setLayerBuffer
cho cùng một lớp trong một chu kỳ trình bày duy nhất.
Việc bật lựa chọn tương thích ngược sẽ có những ảnh hưởng sau:
Đối với AIDL HAL: SurfaceFlinger gửi nhiều thực thể
LayerCommand
cho một lớp duy nhất, mỗi thực thể có mộtBufferCommand
duy nhất. MỗiBufferCommand
chứa một vùng đệm giữ chỗ 1x1 và một số khe cho khe vùng đệm bộ nhớ đệm cần được dọn dẹp.Đối với HAL HIDL: SurfaceFlinger gửi nhiều lệnh
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
. Các lệnh này chứa một mã nhận dạng vùng đệm giữ chỗ 1x1 và một số khe cho khe vùng đệm của bộ nhớ đệm cần được xoá.
Lựa chọn tương thích ngược có thể khiến HAL Trình kết hợp gặp sự cố trên một số thiết bị. Bạn có thể sửa đổi HAL Composer để giải quyết vấn đề này. Mã kiểm soát hành vi này nằm ở đây:
Kiểm thử mức tiêu thụ bộ nhớ của bộ nhớ đệm vùng đệm đồ hoạ
Các kiểm thử không thể xác minh liệu các vị trí trong bộ nhớ đệm có bị xoá bởi các hoạt động triển khai HAL hay không. Tuy nhiên, bạn có thể sử dụng các công cụ gỡ lỗi để theo dõi mức sử dụng bộ nhớ đệm đồ hoạ. Khi giám sát, bạn sẽ nhận thấy có ít lỗi hết bộ nhớ hơn trong các trường hợp có nhiều video khác nhau bị dừng và bắt đầu liên tục trên YouTube.
Có các kiểm thử VTS để xác minh rằng việc triển khai HAL có khả năng nhận các lệnh gọi API mới (HAL phiên bản 3.2 trở lên) hoặc nhiều lệnh setLayerBuffer
cho việc triển khai tương thích ngược. Tuy nhiên, bạn không nên coi đây là hoạt động kiểm thử đủ cho chức năng phù hợp, vì một số thiết bị vượt qua các bài kiểm thử VTS này nhưng không vượt qua được trong các trường hợp sử dụng thực tế.
Đối với các kiểm thử VTS mới, hãy truy cập vào các đường liên kết sau:
Tương thích với HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Tương thích với AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear