Giảm mức tiêu thụ bộ nhớ đồ họa

Trong ngăn xếp đồ họa, bộ đệm đệm trên 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ộ đệm đệm này không bị xóa khi GraphicBufferProducer ngắt kết nối với SurfaceFlinger GraphicBufferConsumer , chẳng hạn như khi MediaCodec bị ngắt kết nối khỏi SurfaceView. Bắt đầu từ Android 14, bạn có thể mạnh mẽ lọc bộ nhớ đệm này để giảm mức tiêu thụ bộ nhớ đồ họa.

Chọn một trong hai tùy 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. Tùy 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 14 trở lên cũng có thể sử dụng tùy chọn này để đạt được toàn bộ 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 API Composer HAL 3.2, bạn có thể bật tùy chọn tương thích ngược. Tùy chọn này tiết kiệm gần như nhiều bộ nhớ như tùy chọn trước đó.

Hai phần sau đây giải thích cách triển khai từng tùy chọn.

Triển khai API Composer HAL 3.2

Để đạt được đầy đủ lợi ích của bộ nhớ đệm đồ họa, bạn phải:

  1. Cập nhật triển khai Composer HAL của bạn lên phiên bản 3.2.
  2. Xử lý LayerCommand::bufferSlotsToClear bằng cách xóa các mục nhập bộ đệm đệm được biểu thị bằng số vị trí được tìm thấy trong danh sách.

Các API Composer HAL 3.2 liên quan đến bộ nhớ đệm đồ họa, bao gồm LayerCommand:bufferSlotsToClear , đều có trong LayerCommand.aidl- .

Kích hoạt tùy chọn tương thích ngược

Tùy chọn giảm bộ nhớ tương thích ngược sẽ thay thế bộ đệm thực trong khe đệm bằng bộ đệm giữ chỗ 1x1, giúp tiết kiệm bộ nhớ cho tất cả các khe đã bị xóa, ngoại trừ khe đệm đang hoạt động hiện tại. Để đạt được lợi ích tiết kiệm bộ nhớ một phần, hãy bật tùy chọn tương thích ngược bằng cách đặt surface_flinger.clear_slots_with_set_layer_buffer sysprop thành true . Sysprop này được tìm thấy trong tệp property_contexts .

Việc đặt sysprop này yêu cầu triển khai Composer HAL của bạn để xử lý chính xác nhiều lệnh setLayerBuffer cho cùng một lớp trong một chu kỳ hiện tại.

Việc bật tùy chọn tương thích ngược có những ảnh hưởng sau:

  • Đối với AIDL HAL: SurfaceFlinger gửi nhiều phiên bản LayerCommand cho một lớp duy nhất, mỗi lớp có một BufferCommand duy nhất. Mỗi BufferCommand chứa một bộ điều khiển bộ đệm giữ chỗ 1x1 và một số vị trí cho vị trí bộ đệm bộ đệm cần được xóa.

  • Đối với HIDL HAL: SurfaceFlinger gửi nhiều lệnh SELECT_DISPLAY , SELECT_LAYER , SET_BUFFER . Các lệnh này chứa bộ điều khiển bộ đệm giữ chỗ 1x1 và số vị trí cho vị trí bộ đệm bộ đệm cần được xóa.

Tùy chọn tương thích ngược có thể khiến Composer HAL gặp sự cố trên một số thiết bị. Bạn có thể sửa đổi Composer HAL của mình để giải quyết vấn đề này. Mã kiểm soát hành vi này được tìm thấy ở đây:

Kiểm tra mức tiêu thụ bộ nhớ đệm của bộ đệm đồ họa

Các cuộc kiểm tra không thể xác minh liệu các khe cắm bộ nhớ đệm có bị xóa bằng cách 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 việc sử dụng bộ đệm đồ họa. Khi theo dõi, bạn sẽ nhận thấy rằng có ít lỗi hết bộ nhớ hơn trong các trường hợp nhiều video khác nhau bị dừng và bắt đầu liên tiếp nhanh chóng trên YouTube.

Các thử nghiệm VTS hiện có để 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+) hoặc nhiều lệnh setLayerBuffer để triển khai tương thích ngược về mặt chức năng. Tuy nhiên, đây không được coi là thử nghiệm đầy đủ để biết chức năng phù hợp vì một số thiết bị vượt qua các thử nghiệm VTS này nhưng lại thất bại trong các trường hợp sử dụng trong thế giới thực.

Đối với các bài kiểm tra VTS mới, hãy điều hướng đến các liên kết sau: