Android 13 bổ sung cấu hình mới có tên AutoSingleLayer
để chốt các bộ đệm không có tín hiệu. Cấu hình này cho phép SurfaceFlinger chốt bộ đệm không được đánh dấu khi chỉ có một lớp duy nhất được cập nhật chứ không phải cho các trường hợp xảy ra trên các lớp, chẳng hạn như thay đổi hình học hoặc giao dịch đồng bộ hóa.
Trước Android 13, cờ debug.sf.latch_unsignaled
trong AOSP cho phép SurfaceFlinger chốt tất cả các bộ đệm không có tín hiệu, bất kể trường hợp sử dụng. Khi cấu hình này được bật, sẽ có những tác dụng phụ không mong muốn, chẳng hạn như phá vỡ các giao dịch đồng bộ hóa và đóng băng toàn bộ màn hình trong khi chờ đợi trên bộ đệm chưa hoàn chỉnh.
Với chế độ AutoSingleLayer
, chỉ có bộ đệm của một bề mặt duy nhất được cập nhật trong khung. Chế độ này cho phép trò chơi và các ứng dụng toàn màn hình khác tận dụng lợi ích của việc chốt các bộ đệm không có tín hiệu và giảm hiện tượng giật ứng dụng trong khi vẫn không bị ảnh hưởng bởi tình trạng treo màn hình.
Cài đặt chế độ AutoSingleLayer
Trong Android 13, AutoSingleLayer
là chế độ mặc định cho tính năng chốt không có tín hiệu. Chế độ này được điều khiển bởi thuộc tính hệ thống debug.sf.auto_latch_unsignaled
.
SurfaceFlinger đọc LatchUnsignaledConfig
khi khởi động. Dưới đây là các cấu hình có thể:
LatchUnsignaledConfig::AutoSingleLayer
Trong chế độ mặc định AOSP này, việc chốt các bộ đệm không có tín hiệu được cho phép khi một lớp duy nhất được cập nhật trong một khung và bản cập nhật chỉ bao gồm một bản cập nhật bộ đệm mà không có giao dịch đồng bộ hóa hoặc thay đổi hình học. Trong chế độ này,
debug.sf.auto_latch_unsignaled
được đặt thànhtrue
theo mặc định.LatchUnsignaledConfig::Disabled
Chế độ này vô hiệu hóa hành vi chốt không được báo hiệu và chỉ chốt các giao dịch được báo hiệu. Chế độ này cũng vô hiệu hóa 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
Trong chế độ này, tất cả các bộ đệm đều được chốt mà không có tín hiệu. Để định cấu hình chế độ này, hãy đặt
debug.sf.latch_unsignaled
thànhtrue
.
Kiểm tra AutoSingleLayer
Để kiểm tra xem bộ đệm có được chốt không có tín hiệu hay không, hãy tìm các dấu vết sau từ SurfaceFlinger trong Perfetto :
Hình 1. Dấu vết của bộ đệm không có tín hiệu được chốt trong Perfetto