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

Kể từ Android 13, vùng đệm khung hình mới (dùng trong quá trình kết hợp ứng dụng) sẽ được phân bổ mỗi khi độ 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ỳ vô hiệu hoá tiếp theo sau khi thay đổi độ phân giải.

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

Thay đổi về độ phân giải xảy ra do một trong hai trường hợp sau:

  • Sự kiện hotplug do Trình tổng 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 hotplug, các tay điều khiển đến vùng đệm khung hình cũ sẽ được giải phóng khi dữ liệu hiển thị cũ được giải phóng.

  • Nút chuyển chế độ hiển thị do SurfaceFlinger khởi tạo, xảy ra khi người dùng 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 tay điều khiển đến vùng đệm khung hình của ứng dụng hiện có trước khi gọi setActiveConfig hoặc setActiveConfigWithConstraints.

Để tránh các sự cố nghiêm trọng, chẳng hạn như phân mảnh bộ nhớ, trên các thiết bị không dành đủ bộ nhớ cho vùng đệm khung hình cũ và mới, điều quan trọng là HWC ngừng sử dụng vùng đệm khung hình cũ và giải phóng mọi tay điều khiển đến các vùng đệm khung hình này như trong các trường hợp sau:

Việc giải phóng các tay điều khiển cho phép bộ nhớ vùng đệm khung hình được phân bổ hoàn toàn trước khi phân bổ các vùng đệm khung hình mới mà SurfaceFlinger thực hiện trong chu kỳ vô hiệu hoá tiếp theo.

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

Nếu HWC không giải phóng các tay điều khiển cho vùng đệm khung hình cũ kịp thời, thì việc phân bổ vùng đệm khung hình mới sẽ diễn ra trước khi giải phóng vùng đệm khung hình cũ. Điều này có thể gây ra các sự cố nghiêm trọng khi quá trình phân bổ mới không thành công do phân mảnh hoặc các vấn đề khác. Tệ hơn nữa, nếu HWC không giải phóng các tay điều khiển này, thì tình trạng rò rỉ bộ nhớ có thể xảy ra.

Để tránh các 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 vùng đệm khung hình ứng dụng cũ cho đến khi vùng đệm khung hình ứng dụng mới được cung cấp, thì điều quan trọng là phải dành đủ bộ nhớ cho cả vùng đệm khung hình cũ và mới, đồng thời có thể chạy các thuật toán phân mảnh trên không gian bộ nhớ vùng đệm khung hình.

  • Phân bổ một nhóm bộ nhớ chuyên dụng cho 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ì giữa việc giải phóng và phân bổ lại vùng đệm khung hình, một quy trình của bên thứ ba có thể cố gắng phân bổ bộ nhớ đồ hoạ. Nếu vùng nhớ đồ hoạ giống nhau được vùng đệm khung hình sử dụng và nếu bộ nhớ đồ hoạ đã đầy, thì quy trình của bên thứ ba có thể chiếm bộ nhớ đồ hoạ do vùng đệm khung hình phân bổ trước đó, do đó không đủ bộ nhớ để phân bổ lại vùng đệm khung hình hoặc có thể phân mảnh không gian bộ nhớ.

Kiểm thử tính năng quản lý vùng đệm khung hình

Các nhà sản xuất thiết bị gốc (OEM) nên kiểm thử việc quản lý bộ nhớ vùng đệm khung hình của ứng dụng một cách thích hợp trên các nút chuyển độ phân giải cho thiết bị của họ, được mô tả như sau:

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

  • Đối với các nút chuyển chế độ, hãy sử dụng quy trình kiểm thử Trình xác minh CTS ModeSwitchingTestActivity để bắt đầu chuyển đổi chế độ nhằm kiểm thử hành vi của bộ nhớ vùng đệm khung hình. Quy trình kiểm thử này có thể xác định trực quan các vấn đề khó phát hiện bằng cách lập trình.