Android 13 giới thiệu một cấu hình mới có tên là AutoSingleLayer
để chốt các vùng đệm chưa được báo hiệu. Cấu hình này cho phép SurfaceFlinger chốt một vùng đệm chưa được báo hiệu khi chỉ có một lớp đang cập nhật.
Giá trị này không áp dụng cho các trường hợp xảy ra trên nhiều lớp, ví dụ: các giao dịch thay đổi hình học hoặc đồng bộ hoá.
Trước đây, cờ debug.sf.latch_unsignaled
trong Dự án nguồn mở Android (AOSP) cho phép SurfaceFlinger chốt tất cả các vùng đệm chưa được báo hiệu, bất kể trường hợp sử dụng là gì. Khi bạn bật cấu hình này, có thể xảy ra các tác dụng phụ không mong muốn, chẳng hạn như làm gián đoạn các giao dịch đồng bộ hoá và làm treo toàn bộ màn hình trong khi chờ các vùng đệm chưa hoàn chỉnh.
Ở chế độ AutoSingleLayer
, SurfaceFlinger chỉ cập nhật một vùng đệm của một bề mặt duy nhất trong một khung hình. Chế độ này cho phép các trò chơi và ứng dụng toàn màn hình khác hưởng lợi từ việc chốt các vùng đệm chưa được báo hiệu và giảm tình trạng giật ứng dụng mà không bị ảnh hưởng bởi tình trạng màn hình bị treo.
Chế độ AutoSingleLayer
Đối với Android 13, AutoSingleLayer
là chế độ mặc định cho tính năng vùng đệm chưa báo hiệu chốt. Chế độ này được kiểm soát bằng thuộc tính hệ thống debug.sf.auto_latch_unsignaled
.
SurfaceFlinger đọc LatchUnsignaledConfig
khi khởi động. Các cấu hình có thể có là:
LatchUnsignaledConfig::AutoSingleLayer
Ở chế độ mặc định này của AOSP, SurfaceFlinger cho phép chốt các vùng đệm chưa được báo hiệu khi một lớp duy nhất cập nhật trong một khung hình. Bản cập nhật chỉ được bao gồm một bản cập nhật vùng đệm mà không có giao dịch đồng bộ hoá hoặc thay đổi về hình học. Theo mặc định, chế độ này đặt
debug.sf.auto_latch_unsignaled
thànhtrue
.LatchUnsignaledConfig::Disabled
Chế độ này vô hiệu hoá hành vi chốt chưa được báo hiệu và chỉ chốt các giao dịch đã được báo hiệu. Chế độ này cũng tắt chế độ
AutoSingleLayer
. Để định cấu hình chế độ này, hãy đặtdebug.sf.latch_unsignaled
vàdebug.sf.auto_latch_unsignaled
thànhfalse
.LatchUnsignaledConfig::Always
Ở chế độ này, SurfaceFlinger sẽ chốt tất cả các vùng đệm chưa được báo hiệu. Để định cấu hình chế độ này, hãy đặt
debug.sf.latch_unsignaled
thànhtrue
.
Kiểm thử AutoSingleLayer
Để kiểm tra xem một vùng đệm có được chốt mà không có tín hiệu hay không, hãy tìm các dấu vết sau đây từ SurfaceFlinger trong Perfetto:
Hình 1. Dấu vết của một vùng đệm chưa được báo hiệu đã chốt trong Perfetto