Impeller: mga pangunahing konsepto, arkitektura, at mga kalamangan

May-akda: IT Sectr Nai-publish: 2026-06-04 Oras ng pagbabasa: 9 min

Ang Impeller ay isang modernong rendering engine para sa Flutter, na binuo ng Google upang palitan ang Skia at alisin ang mga pangunahing problema nito: mga pagkaantala ng shader (jank) sa unang pag-render ng mga frame, mataas na paggamit ng memorya, at kahirapan sa pagsuporta sa iba't ibang graphical backend. Hindi tulad ng Skia, ang Impeller ay nagko-compile ng mga shader nang maaga (offline), gumagamit ng SPIR-V bilang intermediate na representasyon, at direktang gumagana sa Vulkan, Metal, at Direct3D 12. Ayon sa datos ng Flutter Team (2025), inaalis ng Impeller ang hanggang 95% ng mga pagkaantala ng shader, na nagbibigay ng predictable na 60 FPS kahit sa mga entry-level na device.

Mga pangunahing punto

  • Impeller — ang bagong Flutter rendering engine na pumapalit sa Skia
  • Offline compilation ng mga shader ay nag-aalis ng shader jank sa unang pag-render
  • Arkitektura ay gumagamit ng SPIR-V bilang unibersal na intermediate na representasyon
  • Mga backend ng Impeller ay direktang gumagana sa Vulkan, Metal, at Direct3D 12
  • Pagganap ay predictable dahil sa paunang pagproseso ng lahat ng shader

Ano ang Impeller?

Impeller — ay isang graphical rendering engine na may open source, na nakasulat sa C++, na binuo ng Flutter team upang palitan ang Skia bilang pangunahing renderer. Ang proyekto ay inanunsyo noong 2021 bilang tugon sa matagal nang problema ng shader jank na dinaranas ng Skia. Ang Impeller ay hindi isang fork ng Skia — ito ay isang ganap na bagong implementasyon, na idinisenyo na isinasaalang-alang ang mga limitasyon ng mobile GPU at modernong graphical API.

Ang pangunahing ideya ng Impeller ay ang paglipat ng compilation ng shader sa yugto ng pagbuo (build) ng aplikasyon, hindi sa runtime. Sa Skia, ang mga shader ay nico-compile sa unang paggamit, kapag ang user ay nakikipag-ugnayan na sa aplikasyon. Impeller ay nagko-compile ng lahat ng shader nang maaga (offline), ini-pack ang mga ito sa SPIR-V binary format, at inihatid kasama ng aplikasyon. Sa runtime, nilo-load ng Impeller ang mga pre-compiled na shader, na nag-aalis ng mga pagkaantala na nauugnay sa compilation.

Nireso-solusyunan din ng Impeller ang problema sa paggamit ng memorya. Ang Skia ay gumagawa ng maraming pansamantalang bagay (texture, buffer) sa proseso ng rendering, na humahantong sa fragmentation ng memorya sa mga device na may limitadong resources. Impeller ay gumagamit ng memory pools at muling ginagamit ang mga inilaang resources, na binabawasan ang peak memory consumption ng 30–40%.

SPIR-V bilang batayan

SPIR-V (Standard Portable Intermediate Representation) — ay isang intermediate na representasyon ng mga shader na binuo ng Khronos Group. Ginagamit ng Impeller ang SPIR-V bilang unibersal na format para sa lahat ng shader. Sa yugto ng build, ang mga shader sa Impeller language (sariling C++ DSL para sa paglalarawan ng mga epekto) ay nico-compile sa SPIR-V. Sa runtime, ang SPIR-V ay nilo-load at isinasalin sa format na tiyak sa platform — MSL para sa Metal, GLSL para sa Vulkan, o DXIL para sa Direct3D 12.

Paano gumagana ang Impeller?

Ang arkitektura ng Impeller ay binubuo ng ilang layer, bawat isa ay gumaganap ng mahigpit na tinukoy na gawain: pagproseso ng listahan ng rendering commands, pamamahala ng GPU resources, at pag-execute ng mga shader. Ang modularity na ito ay nagpapahintulot sa madaling pagdaragdag ng suporta para sa mga bagong graphical API.

Ang ilalim na layer — ay isang abstraction sa ibabaw ng graphical API (Vulkan, Metal, Direct3D 12). Hindi sinusuportahan ng Impeller ang OpenGL, dahil ang OpenGL ay hindi nagbibigay ng mga kakayahan para sa mahusay na offline compilation ng shader. Sa antas na ito ay ipinatupad: pamamahala ng vertex buffers, paglikha at pag-cache ng pipelines (graphical pipelines), GPU synchronization. Pipeline sa Impeller — ay isang pre-compiled na GPU state na kinabibilangan ng mga shader, rasterization at blending settings. Lahat ng pipeline ay ginagawa sa yugto ng initialization, na nag-aalis ng compilation sa panahon ng rendering.

Ang gitnang layer — ay ang resource management system. Ito ay nag-aalok at muling gumagamit ng GPU resources: texture, buffer, sampler. Sa halip na gumawa ng bagong texture sa bawat frame, ang Impeller ay nagpapanatili ng pool ng mga texture na may iba't ibang laki at format. Ang memory pool ay awtomatikong nagbabalik ng mga hindi nagamit na resources at maaaring lumawak kung kinakailangan, ngunit walang fragmentation na katangian ng Skia.

Ang itaas na layer — ay ang rendering graph kung saan ginagawang Canvas API commands ng Flutter Engine. Tinatanggap ng Impeller ang Display List (listahan ng mga drawing commands) at bumubuo mula dito ng dependency graph ng mga operasyon. Ang graph ay ino-optimize: ang mga hindi kinakailangang rendering pass ay inaalis, ang mga operasyon na may parehong GPU state ay pinagsasama. Pagkatapos ang graph ay ni-compile sa isang sequence ng Vulkan/Metal calls gamit ang mga pre-created pipeline.

Daloy ng execution ng frame sa Impeller

Ang bawat frame ay dumadaan sa isang nakapirming pipeline: Display List → rendering graph → compilation ng graph → pagpapadala ng GPU commands. Ang mga karagdagang pass ay maaaring idagdag para sa post-effects (blur, shadows) o paghahanda ng depth buffer. Oras ng frame sa Impeller ay mas predictable kaysa sa Skia, dahil walang non-deterministic na pagkaantala para sa compilation ng shader.

Impeller vs Skia: paghahambing

Ang paghahambing ng Impeller at Skia ay nagpapakita ng mga pagkakaiba sa diskarte sa rendering. Ang Skia — ay isang unibersal na 2D library para sa pangkalahatang layunin, habang ang Impeller — ay isang specialized engine para sa Flutter, na ino-optimize para sa mga pangangailangan ng mobile UI.

ParameterSkiaImpeller
ShaderCompilation sa runtimeOffline compilation (build time)
Shader jank50–200 ms para sa unang frameWala (0 ms)
Format ng shaderSarili (SkSL)SPIR-V (unibersal)
GPU backendOpenGL, Vulkan, MetalVulkan, Metal, Direct3D 12
Paggamit ng memoryaMataas (pansamantalang texture)Memory pools, hanggang -40%
PlatformAndroid, iOS, Web, DesktopAndroid, iOS, Desktop
StatusStable (pangunahing)Preview (pumapalit sa Skia)

Ang pangunahing pagkakaiba — diskarte sa mga shader. Ang Skia ay nagko-compile ng mga shader sa oras ng paggamit, na lumilikha ng shader jank sa unang pag-render ng mga hindi pamilyar na epekto. Inaalis ito ng Impeller sa pamamagitan ng offline compilation. Sinusuportahan din ng Skia ang OpenGL, na kinakailangan para sa web version ng Flutter, ngunit tinatalikuran ng Impeller ang OpenGL pabor sa mas modernong API, na nagbibigay ng mas mahusay na pagganap sa mga mobile device.

Pagkakatugma sa umiiral na Flutter code

Para sa mga Flutter application, ang paglipat sa Impeller ay hindi nangangailangan ng pagbabago ng code. Ipinapatupad ng Impeller ang parehong Canvas API gaya ng Skia, kaya lahat ng widget, animation, at custom na drawing ay gumagana nang pareho. Ang backward compatibility ay ginagarantiyahan sa antas ng Flutter Engine — pinipili ng engine ang renderer (Skia o Impeller) sa yugto ng initialization ng aplikasyon.

Mga kalamangan ng Impeller

Ang Impeller ay nagbibigay ng ilang nasusukat na kalamangan kumpara sa Skia na direktang nakakaapekto sa karanasan ng user at pagganap ng mga Flutter application.

Pag-aalis ng shader jank

Shader jank — ang pangunahing problema ng Skia na ganap na nireso-solusyunan ng Impeller. Kapag ang isang Flutter application ay nagpapakita ng bagong screen na may gradients, mask, o hindi karaniwang blend, ang Skia ay nagko-compile ng mga shader sa panahon ng animation, na humahantong sa paglaktaw ng mga frame. Impeller nagko-compile ng lahat ng shader sa yugto ng build, kaya ang unang frame ay nire-render nang kasingbilis ng mga sumusunod. Sa mga device na may mabagal na GPU (MediaTek Helio, Qualcomm 400 series) ang pagkakaiba ay lalong kapansin-pansin — hanggang 200 ms pagkaantala para sa bawat bagong uri ng epekto sa Skia kumpara sa 0 ms sa Impeller.

Pagbawas ng paggamit ng memorya

Ang Impeller ay gumagamit ng resource pools para sa pamamahala ng GPU memory. Sa Skia, ang bawat frame ay maaaring gumawa ng mga bagong texture para sa pansamantalang surface, lalo na sa rendering na may transparency o paggamit ng saveLayer. Ang Impeller ay muling gumagamit ng mga texture sa pagitan ng mga frame, na nagbabawas ng peak memory consumption ng 30–40% sa Android at hanggang 25% sa iOS. Ito ay lalong mahalaga para sa mga application na may mahabang listahan at animation, kung saan ang Skia ay maaaring magdulot ng OOM error sa mga device na may 2 GB RAM.

Predictable na pagganap

Sa Skia, ang oras ng rendering ng frame ay maaaring mag-iba depende sa kung aling mga shader ang na-compile na. Ang unang frame na may bagong epekto ay maaaring tumagal ng 50–200 ms, habang ang mga susunod na frame — 3–5 ms. Ang hindi pagka-predictable na ito ay nagpapahirap sa optimization at testing. Tinitiyak ng Impeller ang pare-parehong oras ng frame dahil ang lahat ng shader ay na-compile na at ang paglalaan ng memorya ay predictable. Ang Flutter Engine na may Impeller ay maaaring mas tumpak na kalkulahin ang budget ng oras para sa bawat frame.

Suporta para sa modernong graphical API

Ang Impeller ay direktang gumagana sa Vulkan (Android), Metal (iOS), at Direct3D 12 (Windows), nang walang OpenGL layer. Ito ay nagbibigay ng ilang kalamangan: mas mababang driver latency (hanggang 50% mas mababa kaysa sa pamamagitan ng OpenGL), direktang kontrol sa GPU memory, at access sa mga modernong kakayahan (tile-based GPU architecture, GPU-driven rendering). Ang OpenGL ay hindi na binuo at ang mga driver nito sa mobile device ay madalas na nagiging bottleneck ng pagganap.

Kasalukuyang katayuan at mga plano

Ang Impeller ay nasa aktibong pag-unlad at available sa Flutter Master at Beta channels. Mula sa Flutter 3.16, ang Impeller ay naka-default sa iOS, at sa Android — opsyonal sa pamamagitan ng configuration flag. Ang buong pagpapalit ng Skia ng Impeller ay inaasahan sa isa sa mga stable release ng Flutter sa 2026.

iOS: Impeller default

Sa iOS, ang Impeller ay gumagana sa pamamagitan ng Metal at naka-default mula noong Flutter 3.16. Inirerekomenda ng Flutter team ang pag-test ng mga application sa Impeller at pag-uulat ng mga problema. Para sa pagbabalik sa Skia, gamitin ang Impeller flag sa Info.plist file: FlutterEnableImpeller = NO. Ayon sa datos ng Flutter Team, 92% ng mga application sa iOS ay gumagana sa Impeller nang walang nakikitang regression, at ang pagganap ng animation ay bumubuti ng 25–40%.

Android: opsyonal

Sa Android, ang Impeller ay gumagana sa pamamagitan ng Vulkan. Para i-activate, magdagdag ng meta-tag sa AndroidManifest.xml: io.flutter.embedded_views_preview. Ang Flutter team ay patuloy na nag-o-optimize ng Impeller para sa iba't ibang GPU architecture (Adreno, Mali, PowerVR). Ang pangunahing hamon sa Android ay ang suporta para sa mga device na walang Vulkan (Android < 7.0 o lumang GPU). Para sa mga naturang device, gagamitin ang fallback backend sa Skia o Impeller na may software rasterization.

Desktop at Web

Sa Windows, ang Impeller ay gumagana sa pamamagitan ng Direct3D 12 (naka-activate sa Flutter Master). Sa macOS at Linux — sa pamamagitan ng Metal at Vulkan ayon sa pagkakabanggit. Para sa Web, ang Impeller ay hindi binalak, dahil ang web version ng Flutter ay gumagamit ng CanvasKit (Skia sa pamamagitan ng WebAssembly), at ang shader jank ay hindi kritikal na problema dahil sa ibang mekanismo ng compilation ng shader sa browser. Ang web version ay patuloy na gagamit ng Skia.

Roadmap

Inilathala ng Google ang roadmap ng Impeller: 2024 — Impeller default sa iOS; 2025 — Impeller default sa Android at Windows; 2026 — kumpletong pag-alis ng Skia mula sa Flutter Engine. Pagkatapos nito, gagamitin ng Flutter ang Impeller bilang tanging rendering engine, na magpapasimple ng suporta, magbabawas ng laki ng engine, at magpapabuti ng pagganap sa lahat ng platform.

Mga madalas itanong

Paano i-activate ang Impeller sa Flutter?

Sa iOS, ang Impeller ay naka-default mula sa Flutter 3.16. Sa Android, idagdag ang meta-tag na io.flutter.embedded_views_preview na may value na true sa AndroidManifest.xml. Sa Windows, gamitin ang flag na --enable-impeller sa paglunsad. Sa lahat ng kaso, maaaring pilitin sa pamamagitan ng FlutterEngine sa Dart code.

Bakit palitan ang Skia kung ito ay gumagana?

Gumagana ang Skia, ngunit may mga pangunahing problema: shader jank (50–200 ms pagkaantala para sa compilation ng shader), mataas na paggamit ng memorya, at mga limitasyon ng OpenGL architecture. Impeller ay idinisenyo partikular para sa Flutter at inaalis ang mga problemang ito sa pamamagitan ng offline compilation ng shader at memory pools.

Sinusuportahan ba ng Impeller ang lahat ng widget ng Flutter?

Oo, ipinapatupad ng Impeller ang parehong Canvas API gaya ng Skia. Lahat ng standard na Flutter widget — text, larawan, animation, custom paint — ay gumagana sa Impeller nang walang pagbabago. Ang backward compatibility ay ginagarantiyahan sa antas ng Flutter Engine at ang paglipat ay transparent para sa developer.

Maaari bang gamitin nang sabay ang Skia at Impeller?

Hindi, ang application ay gumagamit ng isang rendering engine sa isang pagkakataon. Ang pagpili ay ginagawa sa initialization ng Flutter Engine sa pamamagitan ng flag. Ang paglipat sa pagitan ng Skia at Impeller sa runtime ng application ay imposible — ang renderer ay nakatakda bago gawin ang unang instance ng FlutterEngine.

Ano ang mangyayari sa Skia pagkatapos ng implementasyon ng Impeller?

Ang Skia ay patuloy na iiral bilang isang independiyenteng library ng Google para sa Chrome, Android, at iba pang proyekto. Sa Flutter, ang Skia ay papalitan ng Impeller bilang pangunahing renderer. Ang Skia ay mananatili para sa web version ng Flutter (sa pamamagitan ng CanvasKit) at bilang fallback option para sa mga device na walang suporta sa Vulkan/Metal.

Buod

  • Impeller — bagong Flutter rendering engine na nag-aalis ng shader jank sa pamamagitan ng offline compilation ng shader
  • Arkitektura batay sa SPIR-V, pre-compiled pipeline, at memory pools
  • Paghahambing sa Skia: walang pagkaantala sa unang pag-render, pagbawas ng memorya ng 30–40%
  • Backend sumusuporta sa Vulkan, Metal, at Direct3D 12 nang walang lumang OpenGL
  • Status sa iOS — default, sa Android at Windows — opsyonal (Flutter 3.16+)
  • Pagkakatugma buo: lahat ng umiiral na Flutter widget ay gumagana nang walang pagbabago sa code
  • Gamitin ang Impeller sa mga bagong Flutter project at i-migrate ang mga luma upang alisin ang lag

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din