Giảm mức tiêu thụ bộ nhớ đồ hoạ

Trong ngăn xếp đồ hoạ, bộ nhớ đệm theo lớp nằm giữa Composer HAL và SurfaceFlinger để giảm chi phí liên quan đến việc gửi các bộ mô tả tệp qua IPC. Trước Android 14, hệ thống không xoá bộ nhớ đệm này khi GraphicBufferProducer ngắt kết nối khỏi GraphicBufferConsumer của SurfaceFlinger, ví dụ: khi MediaCodec 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à giúp tiết kiệm tối đa bộ nhớ. 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 để khai thác 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ộ 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:

  1. Cập nhật việc triển khai HAL của Composer lên phiên bản 3.2.
  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 tệp 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. Điều này giúp tiết kiệm bộ nhớ cho tất cả các khe bị xoá, ngoại trừ khe vùng đệm đang hoạt động. Để đạ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 tác độ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ột BufferCommand duy nhất. Mỗi BufferCommand chứa một tay cầm 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á.

  • Đố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 triển khai HAL có xoá các khe bộ nhớ đệm hay không. Tuy nhiên, bạn có thể dùng các công cụ gỡ lỗi để theo dõi mức sử dụng bộ đệm đồ hoạ. Khi theo dõi, bạn có thể nhận thấy í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 nhanh chóng 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à quy trình kiểm thử đầy đủ để đảm bảo 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 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 xem các đường liên kết sau: