반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

Android Graphics 번역 2편 - Architecture 본문

Android

Android Graphics 번역 2편 - Architecture

huiung 2022. 7. 2. 18:10
반응형

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

 

모든 개발자는 Surfaces, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger, Vulkan에 대해서 알아야 한다.

이 페이지에서는 Android-system-level graphics architecture의 필수적인 요소와 이것들을 App 프레임워크와 multimedia system에서 사용하는 방법에 대해 설명한다. 초점은 그래픽 데이터의 buffer가 어떻게 시스템을 통해 이동하는지에 있다. SurfaceView와 TextureView가 작동하는 방식이나 Surface와 EGLSurface가 상호 작용하는 방법에 대해 궁금한적이 있었다면 올바르게 찾아왔다.

문서의 목표는 출력되는 frame을 rendering하는 것과 관련된 중요한 이벤트들에 대한 세부 정보를 제공하는 것이다. 이것을 달성하기 위해, UI클래스가 사용되는 방식보다는 동작하는 방식을 bottom-up 형태로 묘사 할 것이다.

Android graphics buffer에 대한 설명을 시작으로 합성과 display mechanism에 대해 설명한다. 그런 다음 compositor에 데이터를 제공하는 higher-level-mechanism을 설명한다. 흥미롭게 들리는 주제로 건너뛰기 보다는 아래의 순서롤 문서를 읽을 것을 추천한다.

Low-level components

  • BufferQueue and gralloc: BufferQueue는 그래픽 데이터의 버퍼를 생성하는 생산자를 표시 또는 추가 처리를 위해 데이터를 받아들이는 소비자에 연결한다. Buffer allocation은 공급업체별 HAL interface를 구현한 gralloc memory allocator에 의해서 수행된다.
  • SurfaceFlinger, Hardware composer, virtual displays: SurfaceFlinger는 여러 소스의 데이터 버퍼를 받아 합성하고 display로 보낸다. HWC는 사용 가능한 하드웨어로 버퍼를 합성하는 가장 효율적인 방법을 결정한다. Virtual display는 시스템 내에서 합성 출력을 할 수 있다.(화면 녹화또는 네트워크를 통한 화면 전송을 할 때 필요하다)
  • Surface, canvas, SurfaceHolder: Surface는 SurfaceFlinger에 대해 소비되어지는 Buffer를 생성한다. Surface에 rendering 할때 결과는 consumer에게 전달되며 끝나게 된다. Canvas API는 Surface에 직접 그리기 위한 소프트웨어 구현(하드웨어 가속 지원 포함)을 제공한다.(OpenGL ES에 대한 low-level 대안) View와 관련된 모든 것에는 크기 및 형식과 같은 Surface 매개변수를 가져오고 설정할 수 있는 API가 있는 SurfaceHolder가 포함된다.
  • EGLSurface, OpenGL ES: GLES는 EGL과 결합되도록 설계된 그래픽 rendering API를 정의한다. OS를 통해 window를 만들고 액세스할 수 있는 라이브러리(텍스처가 있는 다각형을 그리려면 GLES 호출을 사용하고 화면에 rendering 하려면 EGL 호출을 사용한다)
  • Vulkan: Vulkan은 고성능 3D 그래픽을 위한 오버헤드가 낮은 크로스 플랫폼 API이다. OpenGL ES와 같이 Vulkan은 app에서 고품질 실시간 그래픽을 만들수 있는 툴을 제공하고 있다. Vulkan의 장점에는 CPU 오버헤드 감소와 SPIR-V Binary Intermediate 언어 지원이 포함된다.

High-level components

  • SurfaceView, GLSurfaceView: SurfaceView는 Surface와 View가 결합된 것이다. SurfaceView의 View component는 앱이 아니라 SurfaceFlinger에 의해 합성된다. 따라서 분리된 thread/process에서 rendering하는 것이 가능하며 앱의 UI rendering과는 독립적이다. GLSurfaceView는 EGL context, thread간 커뮤니케이션, activity lifecycle과의 상호작용 등을 관리하는 helper class를 제공해준다.
  • SurfaceTexture: SurfaceTexture는 Surface와 GLES Texture를 결합하여 앱이 소비자인 BufferQueue를 생성한다. 한 proudcer가 새 buffer를 추가하면 앱에 알린다. 그러면 앱은 이전에 보유하고 있던 buffer를 해제하고 queue에서 새로운 버퍼를 획득하고 EGL을 호출하여 buffer를 GLES에서 external texture로 사용할 수 있도록 한다.
  • TextureView: TextureView는 View와 SurfaceTexture가 결합된 것이다. TextureView는 SurfaceTexture를 래핑하고 콜백에 응답하고 새 buffer를 획득하는 역할을 한다. 그릴 때 TextureView는 가장 최근에 얻은 buffer의 내용을 데이터 소스로 사용하여 view가 표시해야 하는 내용을 렌더링한다. View 합성은 항상 GLES에 의해 수행되며 이것은 View의 업데이트로 인해 다른 View들도 다시 그려질 수 있음을 의미한다.
반응형