Kể từ Android 13, bộ đệm khung mới, được dùng trong khách hàng cấu trúc, được phân bổ bất cứ khi nào độ phân giải màn hình thay đổi. Chiến dịch này quá trình phân bổ được thực hiện bởi SurfaceFlinger 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 trong khi chuyển đổi độ phân giải
Thay đổi về độ phân giải xảy ra do một trong những nguyên nhân sau hai tình huống:
Một sự kiện nóng, do Hardware Composer (Trình tổng hợp phần cứng) khởi tạo (HWC), xảy ra khi hoán đổi từ một bên 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, các xử lý đối với bộ đệm khung cũ sẽ được giải phóng khi dữ liệu hiển thị cũ được phân bổ.
Chuyển đổi 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 cài đặt người dùng, hoặc ứng dụng thay đổi độ phân giải bằng
preferredDisplayModeId
.Trong khi chuyển đổi chế độ hiển thị, các ô điều khiển sẽ xử lý các bộ đệm khung máy khách hiện có được SurfaceFlinger giải phóng trước khi gọi
setActiveConfig
hoặcsetActiveConfigWithConstraints
.
Để tránh những vấn đề nghiêm trọng, chẳng hạn như sự phân mảnh bộ nhớ, trên các thiết bị không dự trữ đủ bộ nhớ cho bộ đệm khung cũ và mới, thì điều quan trọng là HWC ngừng sử dụng bộ đệm khung cũ và giải phóng bất kỳ xử lý các bộ đệm khung này như minh hoạ trong các trường hợp sau:
Đối với các sự kiện phích cắm nóng, ngay trước khi gọi
onHotplug
.Khi chuyển đổi chế độ, ngay sau khi thực hiện lệnh gọi đến
setActiveConfig
hoặcsetActiveConfigWithConstraints
.
Việc giải phóng các ô điều khiển 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 giải phóng trình điều khiển vào bộ đệm khung cũ kịp thời, quá trình phân bổ vùng đệm khung mới diễn ra trước vùng đệm khung cũ sắp xếp. Việc này có thể gây ra những sự cố nghiêm trọng khi quá trình phân bổ mới không thành công do sự phân mảnh hoặc các vấn đề khác. Thậm chí còn tệ hơn, nếu HWC không hề thả những tên người dùng này, việc rò rỉ bộ nhớ có thể xảy ra.
Để tránh các sự cố phân bổ gây ảnh hưở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 của máy khách cũ cho đến khi bộ đệm khung máy khách đã được cung cấp, thì điều quan trọng là phải dự trữ đủ bộ nhớ cho cả bộ đệm khung cũ và mới, đồng thời có thể chạy tính năng chống phân mảnh trên không gian bộ nhớ đệm khung.
Phân bổ nhóm bộ nhớ chuyên dụng cho các bộ đệm khung tách biệt với phần còn lại của bộ nhớ đệm đồ hoạ. Chỉ số này rất quan trọng vì giữa giải phóng và tái phân bổ vùng đệm khung, thì quy trình của bên thứ ba có thể cố gắng phân bổ bộ nhớ đồ hoạ. Nếu nhóm bộ nhớ đồ hoạ tương tự mà bộ đệm khung hình sử dụng và nếu bộ nhớ đồ hoạ đã đầy, bộ nhớ đệm có thể chiếm bộ nhớ đồ hoạ do bộ đệm khung phân bổ trước đó, do đó không đủ bộ nhớ cho việc phân bổ lại vùng đệm khung 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
Nhà sản xuất thiết bị gốc nên kiểm tra để quản lý bộ nhớ đệm khung máy khách phù hợp trên 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 hai màn hình khác nhau bằng các độ phân giải khác nhau.
Đối với việc chuyển đổi chế độ, hãy sử dụng CTS
ModeSwitchingTestActivity
Chương trình kiểm thử của trình xác minh để bắt đầu chuyển đổi chế độ nhằm kiểm thử hành vi của bộ nhớ vùng đệm khung. Kiểm tra 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.