Impeller: مفاهیم کلیدی، معماری و مزایا

نویسنده: IT Sectr منتشر شده: 2026-06-04 زمان مطالعه: 9 دقیقه

Impeller یک موتور رندرینگ مدرن برای Flutter است که توسط Google برای جایگزینی Skia و رفع مشکلات اساسی آن توسعه یافته است: تأخیرهای شیدر (jank) در اولین رندر فریم‌ها، مصرف بالای حافظه و دشواری پشتیبانی از بک‌اندهای مختلف گرافیکی. برخلاف Skia، Impeller شیدرها را از پیش (offline) کامپایل می‌کند، از SPIR-V به عنوان نمایش میانی استفاده می‌کند و مستقیماً با Vulkan، Metal و Direct3D 12 کار می‌کند. طبق داده‌های Flutter Team (2025)، Impeller تا 95% از تأخیرهای شیدر را از بین می‌برد و 60 FPS قابل پیش‌بینی را حتی در دستگاه‌های سطح ابتدایی تضمین می‌کند.

نکات اصلی

  • Impeller — موتور رندرینگ جدید Flutter که جایگزین Skia می‌شود
  • کامپایل آفلاین شیدرها shader jank را در اولین رندر از بین می‌برد
  • معماری از SPIR-V به عنوان نمایش میانی جهانی استفاده می‌کند
  • بک‌اندها Impeller مستقیماً با Vulkan، Metal و Direct3D 12 کار می‌کنند
  • عملکرد به دلیل پردازش پیش‌گیرانه همه شیدرها قابل پیش‌بینی است

Impeller چیست؟

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 به عنوان پایه

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 چگونه کار می‌کند؟

معماری 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 کامپایل می‌شود.

جریان اجرای فریم در Impeller

هر فریم از یک خط لوله ثابت عبور می‌کند: Display List → گراف رندرینگ → کامپایل گراف → ارسال دستورات GPU. عبورهای اضافی ممکن است برای افکت‌های پس‌پردازش (تاری، سایه‌ها) یا آماده‌سازی بافر عمق اضافه شوند. زمان فریم در Impeller قابل پیش‌بینی‌تر از Skia است، زیرا تأخیرهای غیرقطعی برای کامپایل شیدرها وجود ندارد.

Impeller در مقابل Skia: مقایسه

مقایسه Impeller و Skia تفاوت‌هایی را در رویکرد به رندرینگ نشان می‌دهد. Skia — یک کتابخانه 2D عمومی و همه‌منظوره است، در حالی که Impeller — یک موتور تخصصی برای Flutter است که برای نیازهای UI موبایل بهینه‌سازی شده است.

پارامترSkiaImpeller
شیدرهاکامپایل در لحظه (runtime)کامپایل آفلاین (build time)
Shader jank50-200 میلی‌ثانیه برای اولین فریموجود ندارد (0 میلی‌ثانیه)
فرمت شیدرهااختصاصی (SkSL)SPIR-V (جهانی)
بک‌اندهای GPUOpenGL, Vulkan, MetalVulkan, Metal, Direct3D 12
مصرف حافظهزیاد (بافت‌های موقت)استخرهای حافظه، تا 40%-
پلتفرم‌هاAndroid, iOS, Web, DesktopAndroid, iOS, Desktop
وضعیتپایدار (اصلی)Preview (جایگزین Skia)

تفاوت کلیدی — رویکرد به شیدرها. Skia شیدرها را در لحظه استفاده کامپایل می‌کند و shader jank را در اولین رندر افکت‌های ناآشنا ایجاد می‌کند. Impeller این را با کامپایل آفلاین از بین می‌برد. همچنین Skia از OpenGL پشتیبانی می‌کند که برای نسخه وب Flutter ضروری است، اما Impeller به نفع APIهای مدرن‌تر از OpenGL صرف‌نظر می‌کند که عملکرد بهتری در دستگاه‌های موبایل می‌دهد.

سازگاری با کد موجود Flutter

برای برنامه‌های Flutter، انتقال به Impeller نیازی به تغییر کد ندارد. Impeller همان Canvas API پیاده‌سازی شده در Skia را پیاده‌سازی می‌کند، بنابراین همه ویجت‌ها، انیمیشن‌ها و نقاشی‌های سفارشی یکسان کار می‌کنند. سازگاری معکوس در سطح Flutter Engine تضمین می‌شود — موتور رندرر (Skia یا Impeller) را در مرحله مقداردهی اولیه برنامه انتخاب می‌کند.

مزایای Impeller

Impeller چندین مزیت قابل اندازه‌گیری نسبت به Skia ارائه می‌دهد که مستقیماً بر تجربه کاربری و عملکرد برنامه‌های Flutter تأثیر می‌گذارند.

حذف shader jank

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 می‌تواند بودجه زمانی هر فریم را دقیق‌تر محاسبه کند.

پشتیبانی از APIهای گرافیکی مدرن

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 به طور پیش‌فرض

در iOS، Impeller از طریق Metal کار می‌کند و از Flutter 3.16 به طور پیش‌فرض فعال است. تیم Flutter توصیه می‌کند برنامه‌ها را روی Impeller تست کرده و مشکلات را گزارش دهید. برای بازگشت به Skia از پرچم Impeller در فایل Info.plist استفاده می‌شود: FlutterEnableImpeller = NO. طبق داده‌های Flutter Team، 92% از برنامه‌های iOS بدون پسرفت قابل مشاهده روی Impeller کار می‌کنند و عملکرد انیمیشن‌ها 25-40% بهبود می‌یابد.

Android: به صورت اختیاری

در 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 به عنوان تنها موتور رندرینگ استفاده خواهد کرد که پشتیبانی را ساده‌تر کرده، اندازه موتور را کاهش داده و عملکرد را در همه پلتفرم‌ها بهبود می‌بخشد.

سوالات متداول

چگونه Impeller را در Flutter فعال کنیم؟

در iOS، Impeller از Flutter 3.16 به طور پیش‌فرض فعال است. در Android، در AndroidManifest.xml متا-تگ io.flutter.embedded_views_preview را با مقدار true اضافه کنید. در Windows، از پرچم --enable-impeller هنگام راه‌اندازی استفاده کنید. در همه موارد می‌توان از طریق FlutterEngine در کد Dart به اجبار فعال کرد.

چرا Skia را جایگزین کنیم اگر کار می‌کند؟

Skia کار می‌کند، اما مشکلات اساسی دارد: shader jank (50-200 میلی‌ثانیه تأخیر برای کامپایل شیدرها)، مصرف بالای حافظه و محدودیت‌های معماری OpenGL. Impeller به طور خاص برای Flutter طراحی شده است و این مشکلات را از طریق کامپایل آفلاین شیدرها و استخرهای حافظه برطرف می‌کند.

آیا Impeller از همه ویجت‌های Flutter پشتیبانی می‌کند؟

بله، Impeller همان Canvas API را که Skia پیاده‌سازی می‌کند. همه ویجت‌های استاندارد Flutter — متن، تصاویر، انیمیشن‌ها، paintهای سفارشی — بدون تغییر روی Impeller کار می‌کنند. سازگاری معکوس در سطح Flutter Engine تضمین می‌شود و انتقال برای توسعه‌دهنده شفاف است.

آیا می‌توان از Skia و Impeller همزمان استفاده کرد؟

خیر، برنامه در هر لحظه از یک موتور رندرینگ استفاده می‌کند. انتخاب هنگام مقداردهی اولیه Flutter Engine از طریق پرچم انجام می‌شود. تغییر بین Skia و Impeller در حین اجرای برنامه غیرممکن است — رندرر قبل از ایجاد اولین نمونه FlutterEngine تعیین می‌شود.

پس از پیاده‌سازی Impeller چه بر سر Skia می‌آید؟

Skia به عنوان یک کتابخانه مستقل Google برای Chrome، Android و سایر پروژه‌ها به وجود خود ادامه خواهد داد. در Flutter، Skia به عنوان رندرر اصلی با Impeller جایگزین خواهد شد. Skia برای نسخه وب Flutter (از طریق CanvasKit) و به عنوان گزینه پشتیبان برای دستگاه‌های بدون پشتیبانی Vulkan/Metal باقی خواهد ماند.

خلاصه

  • Impeller — موتور رندرینگ جدید Flutter که shader jank را از طریق کامپایل آفلاین شیدرها از بین می‌برد
  • معماری مبتنی بر SPIR-V، پایپ‌لاین‌های از پیش کامپایل شده و استخرهای حافظه
  • مقایسه با Skia: بدون تأخیر در اولین رندر، کاهش حافظه 30-40%
  • بک‌اندها از Vulkan، Metal و Direct3D 12 بدون OpenGL قدیمی پشتیبانی می‌کنند
  • وضعیت در iOS — پیش‌فرض، در Android و Windows — اختیاری (Flutter 3.16+)
  • سازگاری کامل: همه ویجت‌های Flutter بدون تغییر کد کار می‌کنند
  • استفاده کنید از Impeller در پروژه‌های جدید Flutter و پروژه‌های موجود را برای حذف تأخیرها مهاجرت دهید

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید