Impeller: 핵심 개념, 아키텍처 및 장점

저자: IT Sectr 게시일: 2026-06-04 읽는 시간: 9 분

Impeller는 Flutter를 위한 최신 렌더링 엔진으로, Google이 Skia를 대체하고 근본적인 문제(첫 프레임 렌더링 시 셰이더 지연(jank), 높은 메모리 소비, 다양한 그래픽 백엔드 지원의 복잡성)를 해결하기 위해 개발했습니다. Skia와 달리 Impeller는 셰이더를 사전에(오프라인으로) 컴파일하고, SPIR-V를 중간 표현으로 사용하며, Vulkan, Metal 및 Direct3D 12와 직접 작동합니다. Flutter Team(2025)에 따르면, Impeller는 셰이더 지연의 최대 95%를 제거하여 보급형 기기에서도 예측 가능한 60 FPS를 보장합니다.

주요 포인트

  • Impeller — Skia를 대체하는 새로운 Flutter 렌더링 엔진
  • 오프라인 컴파일로 첫 렌더링 시 셰이더 지연 제거
  • 아키텍처는 SPIR-V를 보편적인 중간 표현으로 사용
  • 백엔드는 Vulkan, Metal 및 Direct3D 12와 직접 작동
  • 성능은 모든 셰이더 사전 처리로 예측 가능

Impeller란?

Impeller는 C++로 작성된 오픈 소스 그래픽 렌더링 엔진으로, Flutter 팀이 Skia를 대체할 기본 렌더러로 개발하고 있습니다. 이 프로젝트는 Skia가 겪고 있는 오랜 셰이더 지연 문제에 대한 대응으로 2021년에 발표되었습니다. Impeller는 Skia의 포크가 아니라 모바일 GPU와 최신 그래픽 API의 제한을 고려하여 설계된 완전히 새로운 구현체입니다.

Impeller의 주요 아이디어는 셰이더 컴파일을 런타임 대신 애플리케이션 빌드 단계로 이동하는 것입니다. Skia에서는 사용자가 이미 애플리케이션과 상호작용하고 있을 때 첫 사용 시 셰이더가 컴파일됩니다. Impeller는 모든 셰이더를 사전에(오프라인으로) 컴파일하고, SPIR-V 바이너리 형식으로 패키징하여 애플리케이션과 함께 제공합니다. 런타임에 Impeller는 사전 컴파일된 셰이더를 로드하여 컴파일 지연을 제거합니다.

Impeller는 메모리 소비 문제도 해결합니다. Skia는 렌더링 중에 많은 임시 객체(텍스처, 버퍼)를 생성하여 리소스가 제한된 기기에서 메모리 단편화를 유발합니다. Impeller는 메모리 풀을 사용하고 할당된 리소스를 재사용하여 최대 메모리 소비를 30~40% 줄입니다.

기반으로서의 SPIR-V

SPIR-V(Standard Portable Intermediate Representation)는 Khronos Group이 개발한 셰이더 중간 표현입니다. Impeller는 모든 셰이더에 대해 SPIR-V를 보편적인 형식으로 사용합니다. 빌드 단계에서 Impeller 언어(효과 설명을 위한 사용자 정의 C++ DSL)로 작성된 셰이더는 SPIR-V로 컴파일됩니다. 런타임에 SPIR-V가 로드되어 플랫폼별 형식(Metal용 MSL, Vulkan용 GLSL, Direct3D 12용 DXIL)으로 변환됩니다.

Impeller 작동 방식

Impeller의 아키텍처는 여러 계층으로 구성되며, 각 계층은 엄격하게 정의된 작업(렌더링 명령 목록 처리, GPU 리소스 관리, 셰이더 실행)을 수행합니다. 이러한 모듈성을 통해 새로운 그래픽 API에 대한 지원을 쉽게 추가할 수 있습니다.

최하위 계층은 그래픽 API(Vulkan, Metal, Direct3D 12)에 대한 추상화입니다. Impeller는 OpenGL을 지원하지 않습니다. OpenGL은 효율적인 오프라인 셰이더 컴파일 기능을 제공하지 않기 때문입니다. 이 수준에서 정점 버퍼 관리, 파이프라인 생성 및 캐싱, GPU 동기화가 구현됩니다. Impeller의 파이프라인은 셰이더, 래스터화 설정 및 블렌딩을 포함하는 사전 컴파일된 GPU 상태입니다. 모든 파이프라인은 초기화 중에 생성되어 렌더링 중 컴파일을 제거합니다.

중간 계층은 리소스 관리 시스템입니다. GPU 리소스(텍스처, 버퍼, 샘플러)를 할당하고 재사용합니다. 매 프레임 새 텍스처를 생성하는 대신 Impeller는 다양한 크기와 형식의 텍스처 풀을 유지합니다. 메모리 풀은 사용되지 않는 리소스를 자동으로 반환하고 필요에 따라 확장될 수 있지만, Skia의 특징인 단편화는 없습니다.

최상위 계층은 Flutter Engine이 Canvas API 명령을 변환하는 렌더링 그래프입니다. Impeller는 Display List를 받아 작업 종속성 그래프를 구축합니다. 그래프는 최적화되어 중복 렌더 패스가 제거되고 동일한 GPU 상태의 작업이 병합됩니다. 그런 다음 그래프는 사전 생성된 파이프라인을 사용하여 Vulkan/Metal 호출 시퀀스로 컴파일됩니다.

Impeller의 프레임 실행 흐름

각 프레임은 고정 파이프라인(Display List → 렌더링 그래프 → 그래프 컴파일 → GPU 명령 제출)을 통과합니다. 후처리 효과(블러, 그림자)나 깊이 버퍼 준비를 위해 추가 패스가 추가될 수 있습니다. Impeller의 프레임 시간은 Skia보다 예측 가능합니다. 셰이더 컴파일로 인한 비결정적 지연이 없기 때문입니다.

Impeller vs Skia: 비교

Impeller와 Skia의 비교는 렌더링 접근 방식의 차이를 보여줍니다. Skia는 범용 2D 라이브러리인 반면, Impeller는 모바일 UI 요구 사항에 최적화된 Flutter 전용 엔진입니다.

파라미터SkiaImpeller
셰이더런타임 컴파일오프라인 컴파일(빌드 시간)
셰이더 지연첫 프레임 50~200ms없음(0ms)
셰이더 형식독점(SkSL)SPIR-V(범용)
GPU 백엔드OpenGL, Vulkan, MetalVulkan, Metal, Direct3D 12
메모리 소비높음(임시 텍스처)메모리 풀, 최대 -40%
플랫폼Android, iOS, Web, 데스크톱Android, iOS, 데스크톱
상태안정(주요)미리보기(Skia 대체)

주요 차이점은 셰이더 접근 방식입니다. Skia는 사용 시점에 셰이더를 컴파일하여 처음으로 익숙하지 않은 효과를 렌더링할 때 셰이더 지연을 발생시킵니다. Impeller는 오프라인 컴파일을 통해 이를 제거합니다. 또한 Skia는 Flutter 웹 버전에 필요한 OpenGL을 지원하지만, Impeller는 더 현대적인 API를 위해 OpenGL을 포기하여 모바일 기기에서 더 나은 성능을 제공합니다.

기존 Flutter 코드와의 호환성

Flutter 애플리케이션의 경우 Impeller로 전환하는 데 코드 변경이 필요하지 않습니다. Impeller는 Skia와 동일한 Canvas API를 구현하므로 모든 위젯, 애니메이션 및 사용자 정의 페인팅이 동일하게 작동합니다. 하위 호환성은 Flutter Engine 수준에서 보장됩니다. 엔진은 애플리케이션 초기화 단계에서 렌더러(Skia 또는 Impeller)를 선택합니다.

Impeller의 장점

Impeller는 Skia에 비해 몇 가지 측정 가능한 장점을 제공하며, 이는 사용자 경험과 Flutter 애플리케이션 성능에 직접적인 영향을 미칩니다.

셰이더 지연 제거

셰이더 지연은 Impeller가 완전히 해결하는 Skia의 주요 문제입니다. Flutter 애플리케이션이 그래디언트, 마스크 또는 비표준 블렌드가 포함된 새 화면을 표시할 때 Skia는 애니메이션 중에 셰이더를 컴파일하여 프레임 드롭을 유발합니다. Impeller는 빌드 시점에 모든 셰이더를 컴파일하므로 첫 번째 프레임이 이후 프레임과 동일하게 빠르게 렌더링됩니다. 느린 GPU(MediaTek Helio, Qualcomm 400 시리즈)를 사용하는 기기에서는 Skia에서 새 효과 유형당 최대 200ms 지연이 발생하는 반면 Impeller에서는 0ms로 그 차이가 특히 두드러집니다.

메모리 소비 감소

Impeller는 GPU 메모리 관리를 위해 리소스 풀을 사용합니다. Skia에서는 특히 투명도로 렌더링하거나 saveLayer를 사용할 때 각 프레임이 임시 표면을 위해 새 텍스처를 생성할 수 있습니다. Impeller는 프레임 간에 텍스처를 재사용하여 Android에서 최대 메모리 소비를 30~40%, iOS에서 최대 25%까지 줄입니다. 이는 긴 목록과 애니메이션이 있는 애플리케이션에서 특히 중요하며, Skia는 2GB RAM 기기에서 OOM 오류를 유발할 수 있었습니다.

예측 가능한 성능

Skia에서 프레임 렌더링 시간은 이미 컴파일된 셰이더에 따라 달라질 수 있습니다. 새 효과가 있는 첫 번째 프레임은 50~200ms가 걸릴 수 있는 반면, 이후 프레임은 3~5ms가 걸립니다. 이러한 예측 불가능성은 최적화와 테스트를 어렵게 만듭니다. Impeller는 모든 셰이더가 이미 컴파일되고 메모리 할당이 예측 가능하므로 일관된 프레임 시간을 보장합니다. Impeller가 탑재된 Flutter Engine은 각 프레임의 시간 예산을 더 정확하게 계산할 수 있습니다.

최신 그래픽 API 지원

Impeller는 OpenGL 계층 없이 Vulkan(Android), Metal(iOS) 및 Direct3D 12(Windows)와 직접 작동합니다. 이는 더 낮은 드라이버 지연 시간(OpenGL을 통한 것보다 최대 50% 감소), GPU 메모리에 대한 직접 제어, 최신 기능(타일형 GPU 아키텍처, GPU 기반 렌더링)에 대한 액세스 등 여러 이점을 제공합니다. OpenGL은 더 이상 발전하지 않으며 모바일 기기의 드라이버는 종종 성능 병목 현상이 됩니다.

현재 상태 및 계획

Impeller는 활발히 개발 중이며 Flutter Master 및 Beta 채널에서 사용할 수 있습니다. Flutter 3.16부터 Impeller는 iOS에서 기본적으로 활성화되고 Android에서는 구성 플래그를 통해 선택적으로 활성화됩니다. Skia에서 Impeller로의 완전한 교체는 2026년 Flutter 안정 버전 중 하나에서 예상됩니다.

iOS: 기본 Impeller

iOS에서 Impeller는 Metal을 통해 작동하며 Flutter 3.16부터 기본적으로 활성화됩니다. Flutter 팀은 Impeller에서 애플리케이션을 테스트하고 문제를 보고할 것을 권장합니다. Skia로 되돌리려면 Info.plist 파일에서 Impeller 플래그를 사용합니다: FlutterEnableImpeller = NO. Flutter Team에 따르면, iOS 애플리케이션의 92%가 가시적인 회귀 없이 Impeller에서 실행되며 애니메이션 성능이 25~40% 향상됩니다.

Android: 선택 사항

Android에서 Impeller는 Vulkan을 통해 작동합니다. 활성화하려면 AndroidManifest.xml에 메타 태그 io.flutter.embedded_views_preview를 추가합니다. Flutter 팀은 다양한 GPU 아키텍처(Adreno, Mali, PowerVR)에 대해 Impeller를 최적화하고 있습니다. Android의 주요 과제는 Vulkan이 없는 기기(Android < 7.0 또는 오래된 GPU)를 지원하는 것입니다. 이러한 기기에는 Skia의 폴백 백엔드 또는 소프트웨어 래스터화가 포함된 Impeller가 사용됩니다.

데스크톱 및 웹

Windows에서 Impeller는 Direct3D 12(Flutter Master에서 활성화)를 통해 작동합니다. macOS 및 Linux에서는 각각 Metal 및 Vulkan을 통해 작동합니다. 웹용 Impeller는 계획되지 않았습니다. Flutter 웹 버전은 CanvasKit(WebAssembly를 통한 Skia)을 사용하며, 브라우저의 다른 셰이더 컴파일 메커니즘으로 인해 셰이더 지연은 중요한 문제가 아니기 때문입니다. 웹 버전은 계속 Skia를 사용합니다.

로드맵

Google은 Impeller 로드맵을 발표했습니다: 2024년 — iOS에서 기본 Impeller; 2025년 — Android 및 Windows에서 기본 Impeller; 2026년 — Flutter Engine에서 Skia 완전 제거. 그 후 Flutter는 Impeller를 유일한 렌더링 엔진으로 사용하여 유지 관리를 간소화하고 엔진 크기를 줄이며 모든 플랫폼에서 성능을 향상시킵니다.

자주 묻는 질문

Flutter에서 Impeller를 활성화하는 방법은?

iOS에서 Impeller는 Flutter 3.16부터 기본적으로 활성화됩니다. Android에서는 AndroidManifest.xml에 메타 태그 io.flutter.embedded_views_preview를 true 값으로 추가합니다. Windows에서는 시작 시 --enable-impeller 플래그를 사용합니다. 모든 경우에 Dart 코드에서 FlutterEngine을 통해 강제로 활성화할 수 있습니다.

Skia가 작동하는데 왜 교체해야 하나요?

Skia는 작동하지만 근본적인 문제가 있습니다: 셰이더 지연(셰이더 컴파일에 50~200ms 지연), 높은 메모리 소비, OpenGL 아키텍처 제한입니다. Impeller는 Flutter 전용으로 설계되었으며 오프라인 셰이더 컴파일과 메모리 풀을 통해 이러한 문제를 해결합니다.

Impeller가 모든 Flutter 위젯을 지원하나요?

네, Impeller는 Skia와 동일한 Canvas API를 구현합니다. 텍스트, 이미지, 애니메이션, 사용자 정의 페인팅 등 모든 표준 Flutter 위젯이 변경 없이 Impeller에서 작동합니다. 하위 호환성은 Flutter Engine 수준에서 보장되며 전환은 개발자에게 투명합니다.

Skia와 Impeller를 동시에 사용할 수 있나요?

아니요, 애플리케이션은 한 번에 하나의 렌더링 엔진을 사용합니다. 선택은 플래그를 통해 Flutter Engine을 초기화할 때 이루어집니다. 런타임 중에 Skia와 Impeller 간 전환은 불가능합니다. 렌더러는 첫 번째 FlutterEngine 인스턴스가 생성될 때까지 고정됩니다.

Impeller 도입 후 Skia는 어떻게 되나요?

Skia는 Chrome, Android 및 기타 프로젝트를 위한 독립적인 Google 라이브러리로 계속 존재합니다. Flutter에서 Skia는 Impeller로 주요 렌더러가 대체됩니다. Skia는 Flutter 웹 버전(CanvasKit을 통해)과 Vulkan/Metal을 지원하지 않는 기기를 위한 폴백 옵션으로 남습니다.

요약

  • Impeller — 오프라인 셰이더 컴파일을 통해 셰이더 지연을 제거하는 새로운 Flutter 렌더링 엔진
  • 아키텍처는 SPIR-V, 사전 컴파일된 파이프라인 및 메모리 풀 기반
  • Skia와 비교: 첫 렌더링 시 지연 없음, 메모리 30~40% 감소
  • 백엔드는 레거시 OpenGL 없이 Vulkan, Metal, Direct3D 12 지원
  • 상태: iOS — 기본, Android 및 Windows — 선택 사항(Flutter 3.16+)
  • 호환성 완전함: 모든 기존 Flutter 위젯이 코드 변경 없이 작동
  • 사용 새 Flutter 프로젝트에서 Impeller를 사용하고 기존 프로젝트를 마이그레이션하여 지연 제거

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기