본문 바로가기
Android/Graphics

[Android] Graphics Overview

by 붕어사랑 티스토리 2022. 7. 8.
반응형

https://source.android.com/devices/graphics

 

그래픽  |  Android 오픈소스 프로젝트  |  Android Open Source Project

그래픽 Android 프레임워크는 그래픽 드라이버의 제조업체 구현과 상호작용하는 다양한 2D 및 3D용 그래픽 렌더링 API를 제공합니다. 따라서 이러한 API가 더 높은 수준에서 어떻게 작동하는지를 제

source.android.com

 

안드로이드는 여러가지 그래픽 프레임워크를 제공한다.

이 페이지에 대한 내용은 그래픽 드라이버에 위치해 있는 graphic HAL에 대한 내용이다.

 

안드로이드 앱 개발자는 Canvas, OpenGL ES, Vulkan 세가지의 API써서 이미지를 그릴 수 있다

 

 

 

Android Graphics Components

어떤 API를 사용하든 모든그림은 Surface 위에서 렌더링 된다. Surface는버퍼큐 생산자를 나타내며 이 버퍼큐는 SurfaceFlinger가 사용한다.

 

안드로이드의 모든 Window들은 전부 Surface로 이루어져 있다. 그리고 모든 Visible하게 렌더링된 Surface들은 SurfaceFlinger에 의해 디스플레이에 합성된다.

 

아래 다어그램은 키 컴포넌트들이 어떻게 동작하는지 나타낸다.

 

Surface가 렌더링되는 과정

 

메인 컴포넌트들은 다음과 같다

 

 

Image Stream Producers

이미지 스트림 생산자는 그래픽 버퍼를 생산하는 모든것들을 의미한다. 예를들어 OpenGL ES나 Canvas 2D 또는 미디어서버 비디오 디코더 등이 있다

 

 

Image Stream Consumers

가장 흔한 이미지 스트림 컨슈머는 SurfaceFlinger이다. 이는 현재 Visible한 Surface를 사용하는 System Service이기도 하다. 그리고 이 Surface를 WindowManager로 부터 전달되는 정보를 이용해 디스플레이에 나타내준다.

 

SurfaceFlinger는 디스플레이에 나타나는 컨텐츠를 modify할 수 있는 유일한 서비스이다.

 

SurfaceFlinger는 OpenGL을 사용하며 HardwareComposer를 사용하 Surface Group을 구성할 수 있다.

 

 

다른 OpenGL ES 앱들도 마찬가지로 이미지 스트림을 소모할 수 있다. 예를들어 카메라앱은 카메라 프리뷰 이미지 스트림을 소비한다.

 

ImageReader 클래스 같은 Non-GL 앱도 이미지 스트림 컨슈머가 될 수 있다.

 

 

 

Hardware Composer

디스플레이 서브시스템의 하드웨어 추상화를 나타낸다. SurfaceFlinger는 특정한 Composition work를 GPU와 OpenGL에서 떼어내어(offload하여) 하드웨어 Composer에 전달해줄 수 있다.

 

SurfaceFlinger는 또다는 OpenGL ES 클라이언트 이기도 하다. 그래서 SurfaceFlinger가 하나 또는 두개의 버퍼를 다른것과 Compositing 하려 할 때 OpenGL ES를 사용한다.

 

이렇게 하므로써 Compositing 할 때 전력소모를 GPU가 전부 계산하는것보다 낮게 할 수 있다.

 

Hardware Composer HAL은 나머지 work들을 수행한다. 또한 하드웨어 컴포저는 안드로이드 그래픽 렌더링의 중심점이 된다. 하드웨어 컴포저는 VSYNC같은 기능을 반드시 지원해야 한다. 또다른 기능으론 HDMI 등이 있다.

 

 

 

Gralloc

이미지 생산자의 요청에 의해 그래픽에 사용되는 메모리를 할탕하는 allocator 이다.

자세한것은 이곳을 참조 Gralloc HAL

 

BufferQueue 및 Gralloc  |  Android 오픈소스 프로젝트  |  Android Open Source Project

BufferQueue 및 Gralloc BufferQueue 클래스는 그래픽 데이터의 버퍼를 생성하는 구성요소(생산자)를 디스플레이 또는 추가 처리를 위한 데이터를 허용하는 구성요소(소비자)에 연결합니다. 시스템을 통

source.android.com

 

 

 

 

 

 

Data Flow

아래는 안드로이드 그래픽 파이프라인의 데이터 플로우를 나타내는 그림이다

 

Graphic data flow through Android

 

왼쪽으 오브젝트들은 그래픽버퍼를 생산하는 렌더러들을 나타낸다. 예시로 홈스크린, status bar, 시스템UI등이 있다.

SurfaceFlinger는 Compositor이고 Hardware Composer는 Composer임을 기억하자

 

(뭔말이지... Compositor는 합성자이고 Composer는 구성자라 한다.. 아무튼..)

 

 

 

BufferQueue

버퍼큐는 안드로이드 그래픽 컴포넌트간의 딱풀(glue)같은 역할을 한다. 버퍼큐는 하나의 pair of queue 이며(즉 큐 두개가 하나의 쌍으로 이루어짐) Producer와 Consumer 사이에서 일어나는 끊임없는 사이클을 중재한다.

 

Producer가 버퍼를 넘기면, SurfaceFliger가 디스플레이이 올라갈 모든것이 합성을 담당하게 된다.

 

버퍼큐의 동작 그림

그림에서는 버퍼큐가 하나인것 처럼 나왔지만 설명에는 한쌍의 큐라는 것을 기억

 

 

 

버퍼큐는 이미지 스트림 생산자와 이미지 스트림 소비자를 묶어주는 로직을 가지고 있다.

 

이미지 스트림 생산자의 대표적인 예로 카메라 HAL에서 생성되는 카메라 프리뷰 이미지와 OpenGL ES 게임들이 있다.

 

이미지 스트림 소비자의 대표적인 예시로는 SurfaceFlinger 또는 OpenGL ES 스트림을 사용하는 앱들이다. 가령 카메라 뷰 파인더를 보여주는 카메라앱이 있겠다.

 

 

버퍼큐는 buffer pool을 Queue와 결합하고 Binder IPC를 사용하여 프로세스간에 버퍼를 전달하는 데이터구조를 가지고 있다.

 

Producer의 Interface, 즉 그래픽 버퍼를 생성하고자 하는 모든것에 전달해주는 인터페이스를 IGraphicBufferProducer라고 한다. 그리고 이는 SurfaceTexture의 일부분이다.

 

버퍼큐는 종종 Surface를 렌더링하는데 사용되기도 하고, GL Consumer 또는 다른 tasks들과 함께 consume하기도 한다.

 

 

 

 

버퍼큐는 아래의 세개의 형태로 동작한다

 

Synchronous-like Mode

BufferQueue의 기본동작 모드이다. 이 모드에서는 생산자로부터 들어오는 모든 버퍼가 소비자에게 전달된다. 이 모드에서는 버퍼가 삭제되지 않는다. 생산자가 소모되는 속도보다 빨리 버퍼를 생성하는 경우 차단하고 버퍼가 free될 때 까지 기다립니다.

 

 

Non-blocking Mode


버퍼가 free되길 기다리는 대신 error를 생성한다. 이 모드에서도 버퍼는 삭제되지 않는다. 앱에서 발생할 수 있는 데드락, 교착 상태를 방지하는 데 유용하다.

Discard Mode

error를 생성하거나 기다리는 대신 기존 버퍼를 삭제하도록 구성할 수 있다. 예를 들어 최대한 빨리 텍스처 뷰 및 그림에 대한 GL 렌더링을 수행하는 경우에는 버퍼를 드롭해야 한다.

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

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

반응형

'Android > Graphics' 카테고리의 다른 글

안드로이드 OpenGL 배우기 1부 - 기초  (0) 2023.09.28
[Android] Graphics Architecture  (0) 2022.07.08

댓글