SurfaceFlinger는 버퍼를 받아들이고 버퍼를 구성하며 버퍼를 디스플레이로 보냅니다. WindowManager는 SurfaceFlinger가 노출 영역을 디스플레이에 합성하는 데 사용하는 버퍼 및 창 메타데이터를 SurfaceFlinger에 제공합니다.
SurfaceFlinger
SurfaceFlinger는 두 가지 방법, 즉 BufferQueue 및 SurfaceControl을 통해 또는 ASurfaceControl을 통해 버퍼를 받아들일 수 있습니다.
SurfaceFlinger가 버퍼를 받는 한 가지 방법은 BufferQueue 및 SurfaceControl을 통해서입니다. 앱은 포그라운드로 나올 때 WindowManager에 버퍼를 요청합니다. 그러면 WindowManager는 SurfaceFlinger에 레이어를 요청합니다. 레이어는 BufferQueue가 포함된 노출 영역과 디스플레이 프레임 같은 레이어 메타데이터가 포함된 SurfaceControl의 조합입니다. SurfaceFlinger는 레이어를 생성하여 WindowManager로 보냅니다. 그러면 WindowManager가 노출 영역을 앱으로 보내지만 SurfaceControl을 유지하여 화면에서 앱의 모양을 조작하도록 합니다.
Android 10에 추가된 ASurfaceControl은 SurfaceFlinger가 버퍼를 받을 수 있는 또 다른 방법입니다. ASurfaceControl은 노출 영역과 SurfaceControl을 SurfaceFlinger로 전송되는 하나의 트랜잭션 패키지로 결합합니다. ASurfaceControl은 앱이 ASurfaceTransactions를 통해 업데이트하는 레이어와 연결됩니다. 그러면 앱은 래치 시간, 획득 시간 등의 정보가 포함된 ASurfaceTransactionStats를 전달하는 콜백을 통해 ASurfaceTransactions에 관한 정보를 가져옵니다.
다음 표에는 ASurfaceControl 및 관련 구성요소에 관한 자세한 내용이 나와 있습니다.
구성요소 | 설명 |
---|---|
ASurfaceControl | SurfaceControl을 래핑합니다. 그리고 앱이 디스플레이의 레이어에 부합하는 SurfaceControl을 생성할 수 있게 합니다. ANativeWindow의 하위 요소 또는 다른 ASurfaceControl의 하위 요소로 생성될 수 있습니다. |
ASurfaceTransaction | 트랜잭션을 래핑하여 클라이언트가 도형과 같은 레이어의 설명적 속성을 수정할 수 있도록 하고 업데이트된 버퍼를 SurfaceFlinger로 전송합니다. |
ASurfaceTransactionStats | 래치 시간, 획득 시간 및 이전 릴리스 펜스와 같이 표시된 트랜잭션에 관한 정보를 사전 등록된 콜백을 통해 앱에 전송합니다. |
앱은 버퍼를 언제든지 제출할 수 있지만 SurfaceFlinger는 디스플레이 새로고침 사이에만(기기마다 다를 수 있음) 절전 모드에서 해제되어 버퍼를 받아들입니다. 이를 통해 메모리 사용량을 최소화하고 새로고침 중간에 디스플레이를 업데이트할 때 발생할 수 있는 화면 테어링 현상을 방지할 수 있습니다.
디스플레이가 새로고침 사이에 있을 때 VSYNC 신호를 SurfaceFlinger로 전송합니다. VSYNC 신호는 디스플레이가 테어링 현상 없이 새로고침될 수 있음을 나타냅니다. SurfaceFlinger가 VSYNC 신호를 수신하면 SurfaceFlinger는 레이어 목록을 탐색하여 새 버퍼를 찾습니다. SurfaceFlinger가 새로운 버퍼를 찾으면 SurfaceFlinger는 버퍼를 획득합니다. 새 버퍼를 찾지 못하면 SurfaceFlinger는 이전에 획득한 버퍼를 계속 사용합니다. SurfaceFlinger는 항상 무언가를 표시해야 하므로 하나의 버퍼를 계속 유지합니다. 제출된 버퍼가 없는 레이어는 무시됩니다.
SurfaceFlinger는 보이는 레이어의 모든 버퍼를 수집한 후 하드웨어 컴포저(HWC)에 합성을 어떻게 실행할지 묻습니다. HWC가 레이어 합성 유형을 클라이언트 합성으로 표시하면 SurfaceFlinger가 이러한 레이어를 합성합니다. 그런 다음 SurfaceFlinger는 출력 버퍼를 HWC에 전달합니다.
WindowManager
WindowManager는 view 객체의 컨테이너인 window 객체를 제어합니다. window 객체는 항상 surface 객체에 의해 지원됩니다. WindowManager는 수명 주기, 입력 및 포커스 이벤트, 화면 방향, 전환, 애니메이션, 위치, 변환, Z-order 및 창의 기타 여러 측면을 관리합니다. WindowManager는 모든 창 메타데이터를 SurfaceFlinger로 전송하므로 SurfaceFlinger는 이 데이터를 사용하여 디스플레이의 노출 영역을 합성할 수 있습니다.
사전 회전
다수의 하드웨어 오버레이는 회전을 지원하지 않지만, 지원하더라도 처리 전력을 소모합니다. 따라서 버퍼가 SurfaceFlinger에 도달하기 전에 버퍼를 변환하는 것이 해결책입니다. Android는 ANativeWindow
의 쿼리 힌트(NATIVE_WINDOW_TRANSFORM_HINT
)를 지원하여 SurfaceFlinger가 버퍼에 적용할 가능성이 가장 큰 변환을 나타냅니다. GL 드라이버는 이 힌트를 사용해 버퍼가 SurfaceFlinger에 도달하기 전에 버퍼를 사전 변환하여 버퍼가 도착할 때 올바르게 변환되도록 할 수 있습니다.
예를 들어 90도 회전 힌트를 수신하면 매트릭스를 생성하여 버퍼에 적용함으로써 버퍼가 페이지 끝을 벗어나서 실행되지 않도록 합니다. 전력을 절약하려면 이 사전 회전을 사용하세요. 자세한 내용은 system/core/include/system/window.h
에 정의된 ANativeWindow
인터페이스를 참고하세요.