Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

SurfaceFlinger 및 WindowManager

SurfaceFlinger는 버퍼를 수락하고, 버퍼를 조합하고, 버퍼를 디스플레이로 보냅니다. WindowManager는 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을 래핑하고 앱이 디스플레이의 레이어에 부합하는 SurfaceControls를 만들도록 합니다.
ANativeWindow의 하위 요소 또는 다른 ASurfaceControl의 하위 요소로서 생성될 수 있습니다.
ASurfaceTransaction 트랜잭션을 래핑하여 클라이언트가 도형과 같은 레이어의 설명적 속성을 수정할 수 있도록 하고 업데이트된 버퍼를 SurfaceFlinger로 전송합니다.
ASurfaceTransactionStats 래치 시간, 획득 시간 및 이전 릴리스 펜스와 같이 표시된 트랜잭션에 관한 정보를 사전 등록된 콜백을 통해 앱에 전송합니다.

앱은 버퍼를 언제든지 제출할 수 있지만 SurfaceFlinger는 디스플레이가 새로고침 중이 아닐 때(기기마다 다를 수 있음) 버퍼를 수락하기 위해서만 절전 해제됩니다. 이를 통해 메모리 사용량을 최소화하고 새로고침 중인 디스플레이를 업데이트할 때 눈에 보이는 테어링 현상을 방지할 수 있습니다.

디스플레이가 새로고침 중이 아닐 때는 VSYNC 신호가 SurfaceFlinger로 전송됩니다. VSYNC 신호는 디스플레이가 티어링 현상 없이 새로고침될 수 있음을 나타냅니다. SurfaceFlinger가 VSYNC 신호를 수신하면 SurfaceFlinger는 레이어 목록을 탐색하여 새 버퍼를 찾습니다. SurfaceFlinger가 새로운 버퍼를 찾으면 SurfaceFlinger는 버퍼를 가져옵니다. 그렇지 않은 경우, SurfaceFlinger는 이전에 획득한 버퍼를 계속 사용합니다. SurfaceFlinger는 항상 무언가를 표시해야 하므로 하나의 버퍼를 계속 유지합니다. 제출된 버퍼가 없는 레이어는 무시됩니다.

SurfaceFlinger는 보이는 레이어의 모든 버퍼를 수집한 후 Hardware Composer(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 인터페이스를 참조하세요.