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_unsignaleddebug.sf.auto_latch_unsignaledfalse로 설정합니다.

  • LatchUnsignaledConfig::Always

    이 모드에서는 모든 버퍼가 신호를 받지 않고 래칭됩니다. 이 모드를 구성하려면 debug.sf.latch_unsignaledtrue로 설정합니다.

AutoSingleLayer 테스트

버퍼가 신호를 받지 않고 래칭되었는지 테스트하려면 Perfetto에서 SurfaceFlinger의 다음 트레이스를 찾습니다.

래칭된 신호를 받지 않은 버퍼의 트레이스

그림 1. Perfetto에서 래칭된 신호를 받지 않은 버퍼의 트레이스