본문 바로가기
Android/Graphics

[Android] Graphics Architecture

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

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

 

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

<!-- Copyright 2017 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICE

source.android.com

 

개발자라면 반드시 알아야할 Surface, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger, Vulkan에 대한 내용입니다.

 

해당내용은 안드로이드 그래픽 아키텍쳐를 시스템 레벨 수준에서 설명하고 앱 프레임워크와 멀티미디어 시스템에 어떻게 사용되는지를 서술한다.

 

가장 중점된 사안은 그래픽 데이터 버퍼들이 시스템안에서 어떻게 움직이는가에 대한 것이다. SurfaceView와 TextureView가 어떻게 동작하는지, surface와 EGLSurface가 어떻게 interact하는지 궁금하다면 이 내용이 필수적일 것이다.

 

 

 

 

Low - level Components

 

BufferQueue and Gralloc

 

버퍼큐는 그래픽 데이터 생산자와 그래픽 데이터 소비자를 연결시켜주는 역할을 한다. 버퍼의 allocation은 gralloc에 의해 이루어 진다. 그리고 이 gralloc은 vendor-specific HAL interface를 구현한 것이다.

 

 

SurfaceFlinger, Hardware Composer, Virtual display

 

SurfaceFlinger는 다양한 source로부터 버퍼데이터를 받아오고, 이를 합성하여 디스플레이에 보내는 역할을 한다.

 

HardwareComposer HAL (HWC)는 전달된 버퍼들을 이용가능한 하드웨워어 결합하는데 있어 가장 효율적인 방법을 선택한다.

 

Virtual Display는 시스템 내에서 합성된 output으 사용할 수 있도록 한다.(화면을 녹화하거나 네트워크를 통해 화면을 전송)

 

 

Surface, Canvas, SurfaceHolder

Surface는 SurfaceFlinger에 의해 소모될 버퍼를 생산한다. Surface에 렌더링이 진행될 때, 렌더링의 결과는 하나의 버퍼로 귀결되고 이 버퍼는 Consumer에 전달된다.

 

Canvas는 소프트웨어 수준의 API를 제공한다(하드웨어 가속 지원). 이 API를 이용해 그림을 직접적으로 Surface에 그릴 수 있고 low level 수준에서 OpenGL ES를 대체한다.

 

뷰와 관련된 모든 요소는 SurfaceHolder를 사용한다. SurfaceHolder의 API는 Surface의 파라미터(사이즈나 형식)을 getting 또는 setting 할 수 있다.

 

 

 

 

EGLSurface&OpenGL ES, OpenGL ES(GLES)

EGL과 결합되는 그래픽 렌더링 API를 나타낸다. 이 라이브러리 들은 windows를 생성하고 접근이 가능하다.

텍스쳐 폴리콘을 사용하려면 GLES를 call하고, 스크린에 렌더링을 할 거면 EGL을 call하면 된다.

 

 

Vulkan

오버헤드가 적은 크로스플랫폼 3D graphics API이다. OpenGL ES와 마찬가지로 Vulkan은 앱에서 고품질의 실시간 그래픽을 만들 수 있는 도구를 제공한다. Vulkan은 CPU 오버헤드 감소, SPIR-V 바이너리 중간 언어 지원과 같은 이점이 있다.

 

 

 

 

 

 

High Level Component

 

SurfaceView and GLSurfaceView

SurfaceView는 Surface와 View의 결합된 형태이다. Surface뷰의 View 컴포넌트는 SurfaceFlinger에 의해 합성된다(앱이 하는게 아님). 그리고 이는 앱으로부터 독립적인 스레드/프로세스를 통해 렌더링이 가능하도록 한다. . GLSurfaceView는 EGL 컨텍스트, 스레드 간 통신 및 액티비티 수명 주기와의 interaction할 수 있는 helper 클래스를 제공합니다(하지만 GLES 사용에는 필요하지 않음).

 

 

SurfaceTexture

SurfaceTexture는 Surface와 GLES의 결합이다. 그리고 이 SurfaceTexture는 App이 Consumer가되는 버퍼큐를 생성한다. Producer가 새로운 버퍼를 대기열에 등록할 때, 앱에다가 notify한다. 이때 이전에 잡고있던 버퍼를 해제하고, 버퍼큐에ㅓ 새로운 버퍼를 가져와 EGL을 호출하여 버퍼를 GLES 외부 텍스쳐로 제공한다. Android 7.0에는 보호된 동영상 콘텐츠의 GPU 후처리가 가능한 보안 텍스처 동영상 재생에 관한 지원이 추가되었다.

 

 

TextureView

TextureView는 뷰와 SurfaceTexture가 결합된 형태입니다. TextrueView는 SurfaceTexture를 wrapping 하고 콜백에 responding하고 새로운 버퍼를 가져오는 역할을 맡습니다. TextureView는 drawing을 수행할 때 가장 최근에 수신한 버퍼의 contents를 데이터 소스로 활영하여 뷰 스테이트가 어떻든지 어디있든지 간에 항상 렌더링을 수행합니다. 뷰 합성은 항상 GLES로 수행됩니다. 이는 뷰의 업데이트가 다른 뷰 엘리먼트를 redraw할 수 있음도 의미합니다.

반응형

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

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

댓글