그래픽

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

BufferQueue는 Android 그래픽 구성요소들을 연결시키는 역할을 합니다. BufferQueue는 생산자에서 소비자로 이어지는 버퍼의 끊임없는 순환을 중재하는 큐 쌍입니다. 생산자가 버퍼를 전달하면 SurfaceFlinger는 모든 요소를 디스플레이에 합성해야 합니다.

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

BufferQueue 통신 프로세스

그림 3. BufferQueue 통신 프로세스

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

BufferQueue는 버퍼 풀을 큐와 결합하고 바인더 IPC를 사용하여 프로세스 간에 버퍼를 전달하는 데이터 구조입니다. 그래픽 버퍼를 생성하려는 대상에게 전달하는 요소 또는 생산자 인터페이스는 IGraphicBufferProducer(SurfaceTexture의 일부)입니다. BufferQueue는 흔히 노출 영역에 렌더링하고 다른 작업 중에서 GL 소비자와 함께 소비하는 데 사용됩니다.

BufferQueue는 다음과 같이 세 가지 모드로 작동할 수 있습니다.

동기식 모드 - BufferQueue는 기본적으로 동기식 모드에서 작동합니다. 이 모드에서는 생산자로부터 들어오는 모든 버퍼가 소비자에서 나가게 됩니다. 이 모드에서는 버퍼가 삭제되지 않습니다. 생산자가 너무 빠르고 소모되는 속도보다 빨리 버퍼를 생성하는 경우 차단하고 여유 버퍼를 기다립니다.

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

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

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

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