Android 13에는 신호를 받지 않은 버퍼를 래칭하기 위해 AutoSingleLayer
라는 새 구성이 추가되었습니다. 이 구성을 사용하면 단일 레이어만 업데이트될 때 SurfaceFlinger가 신호를 받지 않은 버퍼를 래칭할 수 있으며, 도형 변경이나 동기화 트랜잭션과 같이 레이어 전체에서 발생하는 경우는 해당하지 않습니다.
Android 13 이전에는 AOSP의 debug.sf.latch_unsignaled
플래그를 사용하여 SurfaceFlinger가 사용 사례와 상관없이 신호를 받지 않은 모든 버퍼를 래칭할 수 있습니다. 이 구성이 사용 설정되면 불완전한 버퍼를 기다리는 동안 동기화 트랜잭션이 중단되고 전체 디스플레이가 정지되는 등 원치 않는 부작용이 발생합니다.
AutoSingleLayer
모드를 사용하면 단일 노출 영역의 버퍼만 프레임에서 업데이트됩니다. 이 모드를 사용하면 게임 및 기타 전체 화면 앱이 디스플레이 정지의 영향을 받지 않으면서 신호를 받지 않은 버퍼를 래칭하고 앱 버벅거림을 줄이는 이점을 얻을 수 있습니다.
AutoSingleLayer 모드 설정
Android 13에서 AutoSingleLayer
는 latch unsignaled 버퍼 기능의 기본 모드입니다. 이 모드는 시스템 속성 debug.sf.auto_latch_unsignaled
에 의해 제어됩니다.
SurfaceFlinger는 부팅 시 LatchUnsignaledConfig
를 읽습니다.
가능한 구성은 다음과 같습니다.
LatchUnsignaledConfig::AutoSingleLayer
이 AOSP 기본 모드에서는 단일 레이어가 프레임에서 업데이트될 때 신호를 받지 않은 버퍼를 래칭할 수 있으며 업데이트에는 동기화 트랜잭션이나 도형 변경이 없는 버퍼 업데이트만 포함됩니다. 이 모드에서는
debug.sf.auto_latch_unsignaled
가 기본적으로true
로 설정됩니다.LatchUnsignaledConfig::Disabled
이 모드는 latch unsignaled 동작을 사용 중지하고 신호를 받은 트랜잭션만 래칭합니다. 이 모드는
AutoSingleLayer
모드도 사용 중지합니다. 이 모드를 구성하려면debug.sf.latch_unsignaled
및debug.sf.auto_latch_unsignaled
를false
로 설정합니다.LatchUnsignaledConfig::Always
이 모드에서는 모든 버퍼가 신호를 받지 않고 래칭됩니다. 이 모드를 구성하려면
debug.sf.latch_unsignaled
를true
로 설정합니다.
AutoSingleLayer
테스트
버퍼가 신호를 받지 않고 래칭되었는지 테스트하려면 Perfetto에서 SurfaceFlinger의 다음 트레이스를 찾습니다.
그림 1. Perfetto에서 래칭된, 신호를 받지 않은 버퍼의 트레이스