Kết nối bộ đệm không tín hiệu bằng AutoSingleLayer

Android 13 thêm một cấu hình mới có tên là AutoSingleLayer để khoá các vùng đệm không được báo hiệu. Cấu hình này cho phép SurfaceFlinger khoá một vùng đệm không được báo hiệu khi chỉ một lớp duy nhất đang 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ộ hoá.

Trước Android 13, cờ debug.sf.latch_unsignaled trong AOSP cho phép SurfaceFlinger khoá tất cả vùng đệm không được báo hiệu, bất kể trường hợp sử dụng. Khi bật cấu hình này, sẽ có các hiệu ứng phụ không mong muốn, chẳng hạn như phá vỡ 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 tất.

Với chế độ AutoSingleLayer, chỉ một vùng đệm của một bề mặt duy nhất được cập nhật trong một khung. Chế độ này cho phép các trò chơi và ứng dụng toàn màn hình khác tận dụng lợi ích của việc khoá các vùng đệm không được báo hiệu và giảm hiện tượ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.

Cài đặt chế độ AutoSingleLayer

Trong Android 13, AutoSingleLayer là chế độ mặc định cho tính năng vùng đệm không được báo hiệu của chốt. Chế độ này do thuộc tính hệ thống debug.sf.auto_latch_unsignaled kiểm soát.

SurfaceFlinger đọc LatchUnsignaledConfig khi khởi động. Sau đây là các cấu hình có thể xảy ra:

  • LatchUnsignaledConfig::AutoSingleLayer

    Ở chế độ mặc định AOSP này, việc khoá các vùng đệm không được báo 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 vùng đệm mà không có giao dịch đồng bộ hoá hoặc thay đổi hình học. Trong chế độ này, debug.sf.auto_latch_unsignaled được đặt thành true theo mặc định.

  • LatchUnsignaledConfig::Disabled

    Chế độ này tắt hành vi không báo hiệu của chốt và chỉ báo hiệu các giao dịch chốt. Chế độ này cũng tắt chế độ AutoSingleLayer. Để định cấu hình chế độ này, hãy đặt debug.sf.latch_unsignaleddebug.sf.auto_latch_unsignaled thành false.

  • LatchUnsignaledConfig::Always

    Ở chế độ này, tất cả vùng đệm đều được khoá không có tín hiệu. Để định cấu hình chế độ này, hãy đặt debug.sf.latch_unsignaled thành true.

Thử nghiệm AutoSingleLayer

Để kiểm tra xem một vùng đệm có được khoá không báo hiệu hay không, hãy tìm các dấu vết sau từ SurfaceFlinger trong Perfetto:

Dấu vết của bộ đệm không được báo hiệu

Hình 1. Dấu vết của bộ đệm không được báo hiệu trong Perfetto