AutoSingleLayer로 신호를 받지 않은 버퍼 래칭

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에서 래칭된, 신호를 받지 않은 버퍼의 트레이스