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

그래픽

Android 그래픽 HAL 아이콘

Android 프레임워크는 그래픽 드라이버의 제조업체 구현과 상호작용하는 다양한 2D 및 3D용 그래픽 렌더링 API를 제공합니다. 따라서 이러한 API가 더 높은 수준에서 어떻게 작동하는지를 제대로 이해하는 것이 중요합니다. 이 페이지에서는 드라이버가 빌드되는 그래픽 하드웨어 추상화 계층(HAL)에 대해 소개합니다.

애플리케이션 개발자는 캔버스, OpenGL ES 또는 Vulkan, 이렇게 세 가지 방식으로 화면에 이미지를 그립니다.

Android 그래픽 구성요소

렌더링 API 개발자가 무엇을 사용하든 모든 것이 '노출 영역'으로 렌더링됩니다. 노출 영역은 주로 SurfaceFlinger에 의해 소비되는 버퍼 대기열의 생산자 측을 나타냅니다. Android 플랫폼에서 생성된 모든 창은 노출 영역에 의해 지원됩니다. 렌더링된 모든 표시 노출 영역은 SurfaceFlinger에 의해 디스플레이에 합성됩니다.

아래 다이어그램은 키 구성요소가 함께 작동하는 방식을 보여줍니다.

이미지 렌더링 구성요소

그림 1. 노출 영역이 렌더링되는 방식

아래에 주요 구성요소가 설명되어 있습니다.

이미지 스트림 생산자

이미지 스트림 생산자는 소비를 위한 그래픽 버퍼를 생성하는 모든 요소일 수 있으며, OpenGL ES, 캔버스 2D 및 미디어 서버 동영상 디코더 등을 예로 들 수 있습니다.

이미지 스트림 소비자

이미지 스트림의 가장 일반적인 소비자는 SurfaceFlinger입니다. 이 시스템 서비스는 현재 표시된 노출 영역을 소비하며, 창 관리자가 제공한 정보를 사용하여 노출 영역을 디스플레이에 합성합니다. SurfaceFlinger는 디스플레이의 콘텐츠를 수정할 수 있는 유일한 서비스입니다. SurfaceFlinger는 OpenGL 및 하드웨어 컴포저를 사용하여 노출 영역 그룹을 구성합니다.

카메라 미리보기 이미지 스트림을 소비하는 카메라 앱과 같은 다른 OpenGL ES 앱도 이미지 스트림을 소비할 수 있습니다. 비 GL 애플리케이션도 소비자가 될 수 있습니다(예: ImageReader 클래스).

하드웨어 컴포저

디스플레이 하위 시스템을 위한 하드웨어 추상화입니다. SurfaceFlinger는 특정 합성 작업을 하드웨어 컴포저에 위임하여 OpenGL 및 GPU의 작업을 오프로드할 수 있습니다. SurfaceFlinger는 그저 또 다른 OpenGL ES 클라이언트로 기능할 뿐입니다. 예를 들어 SurfaceFlinger는 한두 개의 버퍼를 세 번째 버퍼로 합성 중인 경우 OpenGL ES를 사용하고 있습니다. 그러면 GPU가 모든 계산을 수행하도록 하는 경우보다 합성에 소모되는 전력이 낮습니다.

하드웨어 컴포저 HAL은 나머지 절반의 작업을 수행하며, 모든 Android 그래픽 렌더링의 중심점이 됩니다. 하드웨어 컴포저는 이벤트를 지원해야 하며, 여기에는 VSYNC, 그리고 plug-and-playHDMI 지원을 위한 핫플러그도 포함됩니다.

Gralloc

그래픽 메모리 할당자(Gralloc)는 이미지 생산자가 요청한 메모리를 할당하는 데 필요합니다. 자세한 내용은 Gralloc HAL을 참조하세요.

데이터 흐름

아래 다이어그램에는 Android 그래픽 파이프라인이 묘사되어 있습니다.

그래픽 데이터 흐름

그림 2. Android를 통한 그래픽 데이터 흐름

왼쪽 개체는 그래픽 버퍼를 생산하는 렌더러입니다(예: 홈 화면, 상태 표시줄 및 시스템 UI). SurfaceFlinger는 합성자, 하드웨어 컴포저는 구성자입니다.

BufferQueue

BufferQueues는 Android 그래픽 구성요소 간의 글루를 제공합니다. 이는 생산자에서 소비자로 이어지는 버퍼의 끊임없는 순환을 중재하는 대기열 쌍입니다. 생산자가 버퍼를 전달하면 SurfaceFlinger는 모든 요소를 디스플레이에 합성해야 합니다.

BufferQueue 통신 프로세스는 아래 다이어그램을 참조하세요.

BufferQueue 통신 프로세스

그림 3. BufferQueue 통신 프로세스

BufferQueue에는 이미지 스트림 생산자와 이미지 스트림 소비자를 하나로 연결하는 논리가 포함됩니다. 이미지 생산자의 예로는 카메라 HAL 또는 OpenGL ES 게임에 의해 생성된 카메라 미리보기 등이 있습니다. 이미지 소비자의 예로는 SurfaceFlinger 또는 OpenGL ES 스트림을 표시하는 또 다른 앱 등이 있습니다(예: 카메라 뷰파인더를 표시하는 카메라 앱).

BufferQueue는 버퍼 풀을 대기열과 결합하고 바인더 IPC를 사용하여 버퍼를 프로세스 간에 전달하는 데이터 구조입니다. 그래픽 버퍼를 생성하고 싶어하는 대상에게 전달하게 되는 생산자 인터페이스는 SurfaceTexture의 일부인 IGraphicBufferProducer입니다. BufferQueue는 주로 노출 영역에 렌더링하고 GL 소비자로 소비하는 데 사용됩니다. BufferQueue는 다음과 같이 세 가지 모드로 작동할 수 있습니다.

동기식 모드 - BufferQueue가 기본적으로 동기식 모드에서 작동합니다. 여기서는 생산자에서 전송되는 모든 버퍼가 소비자에서 방출됩니다. 이 모드에서는 버퍼가 삭제되지 않습니다. 생산자가 너무 빠르고 소모되는 속도보다 빨리 버퍼를 생성하는 경우 프리 버퍼를 확보할 때까지 차단됩니다.

비차단 모드 - BufferQueue는 이러한 경우에 버퍼를 기다리는 대신 오류를 생성하는 비차단 모드에서도 작동합니다. 이 모드에서도 버퍼는 삭제되지 않습니다. 이 모드는 그래픽 프레임워크의 복잡한 종속성을 이해할 수 없는 애플리케이션에서 발생할 수 있는 교착 상태를 피하는 데 유용합니다.

삭제 모드 - 마지막으로, BufferQueue는 오류를 생성하거나 기다리는 대신 기존 버퍼를 삭제하도록 구성할 수 있습니다. 예를 들어 최대한 빨리 텍스처 뷰 및 그림에 대한 GL 렌더링을 수행하는 경우에는 버퍼를 드롭해야 합니다.

이러한 대부분의 작업을 수행하기 위해 SurfaceFlinger는 그저 또 다른 OpenGL ES 클라이언트로 기능합니다. 예를 들어 한두 개의 버퍼를 세 번째 버퍼로 합성 중인 SurfaceFlinger는 OpenGL ES를 사용하고 있습니다.

하드웨어 컴포저 HAL은 나머지 절반의 작업을 수행합니다. 이 HAL은 모든 Android 그래픽 렌더링에서 중심점 역할을 합니다.