Impeller یک موتور رندرینگ مدرن برای Flutter است که توسط Google برای جایگزینی Skia و رفع مشکلات اساسی آن توسعه یافته است: تأخیرهای شیدر (jank) در اولین رندر فریمها، مصرف بالای حافظه و دشواری پشتیبانی از بکاندهای مختلف گرافیکی. برخلاف Skia، Impeller شیدرها را از پیش (offline) کامپایل میکند، از SPIR-V به عنوان نمایش میانی استفاده میکند و مستقیماً با Vulkan، Metal و Direct3D 12 کار میکند. طبق دادههای Flutter Team (2025)، Impeller تا 95% از تأخیرهای شیدر را از بین میبرد و 60 FPS قابل پیشبینی را حتی در دستگاههای سطح ابتدایی تضمین میکند.
نکات اصلی
Impeller — یک موتور رندرینگ گرافیکی با منبع باز است که به زبان C++ نوشته شده و توسط تیم Flutter برای جایگزینی Skia به عنوان رندرر اصلی توسعه داده میشود. این پروژه در سال 2021 به عنوان پاسخی به مشکل چندین ساله shader jank که Skia از آن رنج میبرد اعلام شد. Impeller یک فورک Skia نیست — این یک پیادهسازی کاملاً جدید است که با در نظر گرفتن محدودیتهای GPUهای موبایل و APIهای گرافیکی مدرن طراحی شده است.
ایده اصلی Impeller انتقال کامپایل شیدرها به مرحله ساخت (build) برنامه است، نه در زمان اجرا. در Skia، شیدرها در اولین استفاده، زمانی که کاربر در حال تعامل با برنامه است، کامپایل میشوند. Impeller همه شیدرها را از پیش (offline) کامپایل میکند، آنها را در قالب باینری SPIR-V بستهبندی کرده و همراه با برنامه ارائه میکند. در زمان اجرا، Impeller شیدرهای از پیش کامپایل شده را بارگذاری میکند که تأخیرهای مربوط به کامپایل را حذف میکند.
Impeller همچنین مشکل مصرف حافظه را حل میکند. Skia اشیاء موقت زیادی (بافتها، بافرها) در فرآیند رندرینگ ایجاد میکند که منجر به تکهتکه شدن حافظه در دستگاههای با منابع محدود میشود. Impeller از استخرهای حافظه (memory pools) استفاده میکند و منابع تخصیص داده شده را مجدداً استفاده میکند و مصرف حافظه اوج را 30-40% کاهش میدهد.
SPIR-V (Standard Portable Intermediate Representation) — یک نمایش میانی شیدر است که توسط Khronos Group توسعه یافته است. Impeller از SPIR-V به عنوان قالب جهانی برای همه شیدرها استفاده میکند. در مرحله ساخت، شیدرها به زبان Impeller (DSL اختصاصی C++ برای توصیف افکتها) به SPIR-V کامپایل میشوند. در زمان اجرا، SPIR-V بارگذاری شده و به قالب خاص پلتفرم ترجمه میشود — MSL برای Metal، GLSL برای Vulkan یا DXIL برای Direct3D 12.
معماری Impeller از چندین لایه تشکیل شده است که هر کدام وظیفه مشخصی را انجام میدهند: پردازش لیست دستورات رندرینگ، مدیریت منابع GPU و اجرای شیدرها. این ماژولاریته امکان افزودن آسان پشتیبانی از APIهای گرافیکی جدید را فراهم میکند.
لایه پایین — انتزاعی بر روی API گرافیکی (Vulkan, Metal, Direct3D 12) است. Impeller از OpenGL پشتیبانی نمیکند، زیرا OpenGL قابلیتهای کامپایل آفلاین کارآمد شیدرها را فراهم نمیکند. در این سطح پیادهسازی شدهاند: مدیریت بافرهای رأس، ایجاد و کش کردن پایپلاینها (خطوط لوله گرافیکی)، همگامسازی GPU. پایپلاین در Impeller — یک حالت GPU از پیش کامپایل شده است که شامل شیدرها، تنظیمات رسترایزیشن و blending است. همه پایپلاینها در مرحله مقداردهی اولیه ایجاد میشوند که کامپایل را در حین رندرینگ حذف میکند.
لایه میانی — سیستم مدیریت منابع است. منابع GPU را تخصیص داده و مجدداً استفاده میکند: بافتها، بافرها، سمپلرها. به جای ایجاد بافت جدید در هر فریم، Impeller یک استخر از بافتها با اندازهها و فرمتهای مختلف نگهداری میکند. استخر حافظه به طور خودکار منابع استفاده نشده را بازمیگرداند و در صورت نیاز میتواند گسترش یابد، اما بدون تکهتکه شدن مشخصه Skia.
لایه بالا — گراف رندرینگ است که Flutter Engine دستورات Canvas API را به آن تبدیل میکند. Impeller Display List (لیست دستورات نقاشی) را دریافت کرده و از آن یک گراف وابستگی عملیات میسازد. گراف بهینهسازی میشود: عبورهای رندرینگ اضافی حذف میشوند، عملیات با وضعیت GPU یکسان ترکیب میشوند. سپس گراف با استفاده از پایپلاینهای از پیش ایجاد شده به دنبالهای از فراخوانیهای Vulkan/Metal کامپایل میشود.
هر فریم از یک خط لوله ثابت عبور میکند: Display List → گراف رندرینگ → کامپایل گراف → ارسال دستورات GPU. عبورهای اضافی ممکن است برای افکتهای پسپردازش (تاری، سایهها) یا آمادهسازی بافر عمق اضافه شوند. زمان فریم در Impeller قابل پیشبینیتر از Skia است، زیرا تأخیرهای غیرقطعی برای کامپایل شیدرها وجود ندارد.
مقایسه Impeller و Skia تفاوتهایی را در رویکرد به رندرینگ نشان میدهد. Skia — یک کتابخانه 2D عمومی و همهمنظوره است، در حالی که Impeller — یک موتور تخصصی برای Flutter است که برای نیازهای UI موبایل بهینهسازی شده است.
| پارامتر | Skia | Impeller |
|---|---|---|
| شیدرها | کامپایل در لحظه (runtime) | کامپایل آفلاین (build time) |
| Shader jank | 50-200 میلیثانیه برای اولین فریم | وجود ندارد (0 میلیثانیه) |
| فرمت شیدرها | اختصاصی (SkSL) | SPIR-V (جهانی) |
| بکاندهای GPU | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| مصرف حافظه | زیاد (بافتهای موقت) | استخرهای حافظه، تا 40%- |
| پلتفرمها | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| وضعیت | پایدار (اصلی) | Preview (جایگزین Skia) |
تفاوت کلیدی — رویکرد به شیدرها. Skia شیدرها را در لحظه استفاده کامپایل میکند و shader jank را در اولین رندر افکتهای ناآشنا ایجاد میکند. Impeller این را با کامپایل آفلاین از بین میبرد. همچنین Skia از OpenGL پشتیبانی میکند که برای نسخه وب Flutter ضروری است، اما Impeller به نفع APIهای مدرنتر از OpenGL صرفنظر میکند که عملکرد بهتری در دستگاههای موبایل میدهد.
برای برنامههای Flutter، انتقال به Impeller نیازی به تغییر کد ندارد. Impeller همان Canvas API پیادهسازی شده در Skia را پیادهسازی میکند، بنابراین همه ویجتها، انیمیشنها و نقاشیهای سفارشی یکسان کار میکنند. سازگاری معکوس در سطح Flutter Engine تضمین میشود — موتور رندرر (Skia یا Impeller) را در مرحله مقداردهی اولیه برنامه انتخاب میکند.
Impeller چندین مزیت قابل اندازهگیری نسبت به Skia ارائه میدهد که مستقیماً بر تجربه کاربری و عملکرد برنامههای Flutter تأثیر میگذارند.
Shader jank — مشکل اصلی Skia که Impeller کاملاً آن را حل میکند. وقتی برنامه Flutter صفحه جدیدی با گرادینتها، ماسکها یا بلندهای غیراستاندارد نمایش میدهد، Skia شیدرها را در حین انیمیشن کامپایل میکند که منجر به جا افتادن فریمها میشود. Impeller همه شیدرها را در مرحله ساخت کامپایل میکند، بنابراین اولین فریم به همان سرعت فریمهای بعدی رندر میشود. در دستگاههای با GPU کند (MediaTek Helio, Qualcomm 400 series) تفاوت به ویژه قابل توجه است — تا 200 میلیثانیه تأخیر برای هر نوع افکت جدید در Skia در مقابل 0 میلیثانیه در Impeller.
Impeller از استخرهای منابع برای مدیریت حافظه GPU استفاده میکند. در Skia هر فریم ممکن است بافتهای جدیدی برای سطوح موقت ایجاد کند، به ویژه هنگام رندرینگ با شفافیت یا استفاده از saveLayer. Impeller بافتها را بین فریمها مجدداً استفاده میکند که مصرف حافظه اوج را 30-40% در Android و تا 25% در iOS کاهش میدهد. این به ویژه برای برنامههای با لیستهای طولانی و انیمیشنها مهم است، جایی که Skia میتوانست در دستگاههای با 2 گیگابایت RAM باعث خطاهای OOM شود.
در Skia زمان رندر فریم میتواند بسته به اینکه کدام شیدرها قبلاً کامپایل شدهاند متفاوت باشد. اولین فریم با افکت جدید ممکن است 50-200 میلیثانیه طول بکشد، در حالی که فریمهای بعدی 3-5 میلیثانیه. این غیرقابل پیشبینیبودن بهینهسازی و تست را دشوار میکند. Impeller زمان فریم یکنواختی را تضمین میکند، زیرا همه شیدرها قبلاً کامپایل شدهاند و تخصیص حافظه قابل پیشبینی است. Flutter Engine با Impeller میتواند بودجه زمانی هر فریم را دقیقتر محاسبه کند.
Impeller مستقیماً با Vulkan (Android)، Metal (iOS) و Direct3D 12 (Windows) بدون لایه OpenGL کار میکند. این چندین مزیت دارد: تأخیر کمتر درایور (تا 50% کمتر از OpenGL)، کنترل مستقیم بر حافظه GPU و دسترسی به قابلیتهای مدرن (معماری کاشیای GPU، GPU-driven rendering). OpenGL دیگر توسعه نمییابد و درایورهای آن در دستگاههای موبایل اغلب به گلوگاه عملکرد تبدیل میشوند.
Impeller در مرحله توسعه فعال قرار دارد و در کانالهای Flutter Master و Beta در دسترس است. از Flutter 3.16، Impeller به طور پیشفرض در iOS فعال است و در Android — به صورت اختیاری از طریق پرچم پیکربندی. جایگزینی کامل Skia با Impeller در یکی از انتشارات پایدار Flutter در سال 2026 انتظار میرود.
در iOS، Impeller از طریق Metal کار میکند و از Flutter 3.16 به طور پیشفرض فعال است. تیم Flutter توصیه میکند برنامهها را روی Impeller تست کرده و مشکلات را گزارش دهید. برای بازگشت به Skia از پرچم Impeller در فایل Info.plist استفاده میشود: FlutterEnableImpeller = NO. طبق دادههای Flutter Team، 92% از برنامههای iOS بدون پسرفت قابل مشاهده روی Impeller کار میکنند و عملکرد انیمیشنها 25-40% بهبود مییابد.
در Android، Impeller از طریق Vulkan کار میکند. برای فعالسازی، در AndroidManifest.xml یک متا-تگ اضافه میشود: io.flutter.embedded_views_preview. تیم Flutter به بهینهسازی Impeller برای معماریهای مختلف GPU (Adreno, Mali, PowerVR) ادامه میدهد. چالش اصلی در Android پشتیبانی از دستگاههای بدون Vulkan (Android < 7.0 یا GPUهای قدیمی) است. برای چنین دستگاههایی از بکاند بازگشتی روی Skia یا Impeller با رسترایزیشن نرمافزاری استفاده خواهد شد.
در Windows، Impeller از طریق Direct3D 12 کار میکند (در Flutter Master فعال است). در macOS و Linux — به ترتیب از طریق Metal و Vulkan. برای وب، Impeller برنامهریزی نشده است، زیرا نسخه وب Flutter از CanvasKit (Skia از طریق WebAssembly) استفاده میکند و shader jank به دلیل مکانیزم متفاوت کامپایل شیدر در مرورگر یک مشکل بحرانی نیست. نسخه وب به استفاده از Skia ادامه خواهد داد.
Google نقشه راه Impeller را منتشر کرده است: 2024 — Impeller به طور پیشفرض در iOS؛ 2025 — Impeller به طور پیشفرض در Android و Windows؛ 2026 — حذف کامل Skia از Flutter Engine. پس از آن، Flutter از Impeller به عنوان تنها موتور رندرینگ استفاده خواهد کرد که پشتیبانی را سادهتر کرده، اندازه موتور را کاهش داده و عملکرد را در همه پلتفرمها بهبود میبخشد.
سوالات متداول
در iOS، Impeller از Flutter 3.16 به طور پیشفرض فعال است. در Android، در AndroidManifest.xml متا-تگ io.flutter.embedded_views_preview را با مقدار true اضافه کنید. در Windows، از پرچم --enable-impeller هنگام راهاندازی استفاده کنید. در همه موارد میتوان از طریق FlutterEngine در کد Dart به اجبار فعال کرد.
Skia کار میکند، اما مشکلات اساسی دارد: shader jank (50-200 میلیثانیه تأخیر برای کامپایل شیدرها)، مصرف بالای حافظه و محدودیتهای معماری OpenGL. Impeller به طور خاص برای Flutter طراحی شده است و این مشکلات را از طریق کامپایل آفلاین شیدرها و استخرهای حافظه برطرف میکند.
بله، Impeller همان Canvas API را که Skia پیادهسازی میکند. همه ویجتهای استاندارد Flutter — متن، تصاویر، انیمیشنها، paintهای سفارشی — بدون تغییر روی Impeller کار میکنند. سازگاری معکوس در سطح Flutter Engine تضمین میشود و انتقال برای توسعهدهنده شفاف است.
خیر، برنامه در هر لحظه از یک موتور رندرینگ استفاده میکند. انتخاب هنگام مقداردهی اولیه Flutter Engine از طریق پرچم انجام میشود. تغییر بین Skia و Impeller در حین اجرای برنامه غیرممکن است — رندرر قبل از ایجاد اولین نمونه FlutterEngine تعیین میشود.
Skia به عنوان یک کتابخانه مستقل Google برای Chrome، Android و سایر پروژهها به وجود خود ادامه خواهد داد. در Flutter، Skia به عنوان رندرر اصلی با Impeller جایگزین خواهد شد. Skia برای نسخه وب Flutter (از طریق CanvasKit) و به عنوان گزینه پشتیبان برای دستگاههای بدون پشتیبانی Vulkan/Metal باقی خواهد ماند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.