Khóa vùng đệm không có tín hiệu bằng AutoSingleLayer

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

  • 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 đặt debug.sf.latch_unsignaleddebug.sf.auto_latch_unsignaled thành false.

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

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:

Dấu vết của bộ đệm chưa được báo hiệu đã chốt

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