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
Các thay đổi về độ phân giải xảy ra do một trong 2 tình huống 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 máy khách hiện có trước khi gọi
setActiveConfig
hoặcsetActiveConfigWithConstraints
.
Để 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:
Đối với các sự kiện hotplug, ngay trước khi gọi
onHotplug
.Đối với các nút chuyển chế độ, ngay sau lệnh gọi đến
setActiveConfig
hoặcsetActiveConfigWithConstraints
.
Việc giải phóng tay cầm cho phép giải phóng hoàn toàn bộ nhớ đệm khung trước khi phân bổ bộ đệm khung 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
Nếu HWC không kịp thời giải phóng các ô điều khiển vào các bộ đệm khung cũ, thì quá trình phân bổ bộ đệm khung mới sẽ diễn ra trước khi giải phóng bộ đệm khung 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 hề 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 bộ đệm khung máy khách cũ cho đến khi bộ đệm khung ứng dụng mới được cung cấp, thì bạn phải dự trữ đủ bộ nhớ cho cả bộ đệm khung cũ và mới, đồ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ớ đệm khung.
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 bộ nhớ đồ hoạ đó được sử dụng bởi bộ đệm khung 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 bộ đệm khung phân bổ trước đó, từ đó gây ra tình trạng không đủ bộ nhớ để phân bổ lại bộ đệm khung hoặc có thể phân mảnh dung lượng 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 đổi độ phân giải cho thiết bị của họ, được mô tả như sau:
Đối với các sự kiện cắm nóng, bạn chỉ cần rút phích cắm rồi kết nối lại 2 màn hình có độ phân giải khác nhau.
Đối với việc chuyển đổi chế độ, hãy sử dụng quy trình kiểm thử Trình xác minh CTS
ModeSwitchingTestActivity
để bắt đầu việc chuyển chế độ nhằm kiểm thử hành vi của bộ nhớ đệm khung. 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 theo phương thức lập trình.