Chốt bộ đệm không định danh với AutoSingleLayer

Android 13 bổ sung một cấu hình mới có tên AutoSingleLayer để chốt bộ đệm chưa được báo hiệu. Cấu hình này cho phép SurfaceFlinger chốt bộ đệm không được báo hiệu khi chỉ có một lớp duy nhất đang cập nhật và không dành 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 chưa được ký 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 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 không đầy đủ.

Với chế độ AutoSingleLayer , chỉ một vùng đệm của một bề mặt được cập nhật trong một 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 bộ đệm không được đánh dấu và giảm tải ứng dụng trong khi vẫn không bị ảnh hưởng bởi màn hình treo.

Cài đặt chế độ AutoSingleLayer

Trong Android 13, AutoSingleLayer là chế độ mặc định cho tính năng bộ đệm không báo hiệu chốt. 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 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 bộ đệm mà không có giao dịch đồng bộ hóa hoặc thay đổi hình học. Ở chế độ này, debug.sf.auto_latch_unsignaled được đặt thành true 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 đặt debug.sf.latch_unsignaleddebug.sf.auto_latch_unsignaled thành false .

  • LatchUnsignaledConfig::Always

    Trong chế độ này, tất cả các bộ đệm được chốt không được báo hiệu. Để định cấu hình chế độ này, hãy đặt debug.sf.latch_unsignaled thành true .

Kiểm tra AutoSingleLayer

Để kiểm tra xem bộ đệm có được chốt không được đánh dấ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 báo hiệu đã chốt

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