Trong ngăn xếp đồ hoạ, bộ nhớ đệm vùng đệm trên mỗi lớp nằm giữa Composer HAL và SurfaceFlinger để giảm mức hao tổn liên quan đến việc gửi chỉ số mô tả tệp qua IPC. Trước Android 14, bộ nhớ đệm vùng đệm này không được xoá 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 với SurfaceView. Kể từ Android 14, bạn có thể buộc xoá hoàn toàn bộ nhớ đệm của bộ đệm này để giảm mức tiêu thụ bộ nhớ đồ hoạ.
Chọn một trong hai cách sau:
- Đối với các thiết bị chạy Android 14 trở lên, bạn phải triển khai API HAL Composer 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 nhiều bộ nhớ nhất. Các thiết bị nâng cấp lên Android 14 trở lên cũng có thể sử dụng tuỳ chọn này để khai thác tối đa bộ nhớ.
- Đối với các 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 tuỳ chọn tương thích ngược. Tuỳ chọn này tiết kiệm gần như nhiều bộ nhớ như tuỳ chọn trước.
Hai phần sau đây giải thích cách triển khai từng tuỳ chọn.
Triển khai API Composer HAL 3.2
Để đạt được toàn bộ lợi ích của bộ nhớ vùng đệm đồ hoạ, bạn phải:
- Cập nhật phương thức triển khai HAL (Lớp trừu tượng phần cứng) cho Trình soạn thảo lên phiên bản 3.2.
- Xử lý
LayerCommand::bufferSlotsToClear
bằng cách xoá các mục bộ nhớ đệm được chỉ định bằng số khe trong danh sách.
Các API Composer HAL 3.2 liên quan đến bộ nhớ vùng đệm đồ hoạ, bao gồm cả LayerCommand:bufferSlotsToClear
, nằm trong LayerCommand.aidl-
.
Bật tuỳ chọn tương thích ngược
Tuỳ chọn giảm bộ nhớ tương thích ngược sẽ thay thế vùng đệm thực trong khe bộ nhớ đệm bằng vùng đệm phần giữ chỗ 1x1, giúp tiết kiệm bộ nhớ cho tất cả các khe đã xoá, ngoại trừ khe vùng đệm đang hoạt động hiện tại. Để đạt được một số lợi ích tiết kiệm bộ nhớ, hãy bật tuỳ 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
. Bạn có thể tìm thấy sysprop này trong tệp property_contexts
.
Việc đặt sysprop này yêu cầu triển khai HAL của Trình soạn thảo để 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 tuỳ chọn tương thích ngược có các ảnh hưởng sau đây:
Đối với HAL AIDL: SurfaceFlinger gửi nhiều thực thể
LayerCommand
cho một lớp, mỗi lớp có mộtBufferCommand
. MỗiBufferCommand
chứa một tay điều khiển vùng đệm phần giữ chỗ 1x1 và một số khe cho khe vùng đệm bộ nhớ đệm cần được xoá.Đối với các 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 ô điều khiển vùng đệm phần giữ chỗ 1x1 và một số ô cho vùng đệm bộ nhớ đệm cần được xoá hoàn toàn.
Tuỳ chọn tương thích ngược có thể khiến HAL của Composer gặp sự cố trên một số thiết bị. Bạn có thể sửa đổi HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo để giải quyết vấn đề này. Bạn có thể tìm thấy mã kiểm soát hành vi này tại đây:
Kiểm thử mức sử dụng bộ nhớ đệm vùng đệm đồ hoạ
Các chương trình kiểm thử không thể xác minh liệu các khe bộ nhớ đệm có bị xoá sạch 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 mức sử dụng vùng đệm đồ hoạ. Khi theo dõi, bạn sẽ nhận thấy rằng sẽ 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 trên YouTube.
Có các chương trình kiểm thử VTS để xác minh rằng việc triển khai HAL có chức năng nhận được 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
để triển khai tương thích ngược. Tuy nhiên, đây không phải là quy trình kiểm thử đầy đủ cho chức năng thích 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 bài 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