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

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à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 đề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ành true .

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 :

Dấu vết của bộ đệm không có tín hiệu được chốt

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