Quản lý vùng đệm khung hình của ứng dụng

Kể từ Android 13, hệ thống sẽ phân bổ các vùng đệm khung hình mới (được dùng trong quá trình kết hợp máy khách) bất cứ khi nào độ phân giải màn hình thay đổi. SurfaceFlinger thực hiện việc phân bổ này trong chu kỳ invalidate tiếp theo sau khi có thay đổi về độ phân giải.

Quản lý vùng đệm khung trong quá trình chuyển đổi độ phân giải

Độ phân giải thay đổi do một trong hai trường hợp sau:

  • Một sự kiện cắm nóng do Trình kết hợp phần cứng (HWC) khởi tạo, xảy ra khi hoán đổi từ một màn hình ngoài sang một màn hình ngoài khác có độ phân giải mặc định khác.

    Trong sự kiện cắm nóng, HWC sẽ giải phóng các ô điều khiển cho các vùng đệm khung hình cũ khi giải phóng dữ liệu màn hình cũ.

  • Chế độ hiển thị chuyển đổi do SurfaceFlinger khởi tạo, xảy ra khi bạn thay đổi độ phân giải bằng chế độ cài đặt người dùng hoặc một ứng dụng thay đổi độ phân giải bằng preferredDisplayModeId.

    Trong quá trình chuyển đổi chế độ hiển thị, SurfaceFlinger sẽ giải phóng các thao tác đối với các khung hình đệm hiện có của ứng dụng trước khi gọi setActiveConfig hoặc setActiveConfigWithConstraints.

Để ngăn chặn các vấn đề nghiêm trọng như phân mảnh bộ nhớ trên các thiết bị không có đủ bộ nhớ vùng đệm khung, HWC phải giải phóng các xử lý cho vùng đệm khung cũ. Điều này rất quan trọng trong các trường hợp sau:

Việc giải phóng các giá trị nhận dạng cho phép huỷ hoàn toàn việc phân bổ bộ nhớ vùng đệm khung trước khi SurfaceFlinger phân bổ các vùng đệm khung mới trong chu kỳ invalidate tiếp theo.

Đề xuất về việc quản lý khung hình đệm

Nếu HWC không giải phóng các xử lý cho các vùng đệm khung cũ kịp thời, thì việc phân bổ vùng đệm khung mới sẽ xảy ra trước khi giải phóng vùng đệm khung cũ. Điều này có thể gây ra các vấn đề nghiêm trọng khi việc phân bổ mới không thành công do phân mảnh hoặc các vấn đề khác. Thậm chí, nếu HWC không giải phóng các xử lý này, thì có thể xảy ra tình trạng rò rỉ bộ nhớ.

Để tránh lỗi phân bổ nghiêm trọng, hãy làm theo các đề xuất sau:

  • Nếu HWC cần tiếp tục sử dụng các khung hình bộ đệm cũ của ứng dụng cho đến khi các khung hình bộ đệm mới của ứng dụng được cung cấp, thì việc dành đủ bộ nhớ cho cả khung hình bộ đệm cũ và mới là điều quan trọng, đồng thời có thể chạy các thuật toán chống phân mảnh trên không gian bộ nhớ khung hình bộ đệm.

  • Phân bổ một nhóm bộ nhớ chuyên dụng cho các vùng đệm khung hình, tách biệt với phần còn lại của bộ nhớ vùng đệm đồ hoạ. Điều này rất quan trọng vì một quy trình của bên thứ ba có thể cố gắng phân bổ bộ nhớ đồ hoạ giữa quá trình huỷ phân bổ và phân bổ lại bộ nhớ khung hình. Nếu vùng đệm khung hình dùng cùng một nhóm bộ nhớ đồ hoạ và nếu bộ nhớ đồ hoạ đầy, thì quy trình của bên thứ ba có thể chiếm bộ nhớ mà vùng đệm khung hình đã phân bổ trước đó. Điều này có thể dẫn đến tình trạng không đủ bộ nhớ để phân bổ lại vùng đệm khung hoặc phân mảnh bộ nhớ.

Kiểm thử hoạt động quản lý bộ đệm khung

Các OEM nên kiểm thử để quản lý bộ nhớ khung hình đệm của ứng dụng một cách thích hợp trên các công tắc độ phân giải cho thiết bị của họ, như mô tả dưới đây:

  • Đối với các sự kiện cắm nóng, hãy rút phích cắm và kết nối lại hai màn hình có độ phân giải khác nhau.

  • Đối với các chế độ chuyển đổi, hãy sử dụng kiểm thử ModeSwitchingTestActivity CTS Verifier để bắt đầu chuyển đổi chế độ nhằm kiểm thử hành vi bộ nhớ khung hình. Bài kiểm thử này có thể xác định bằng hình ảnh những vấn đề khó phát hiện theo phương thức lập trình.