Impeller هو محرك عرض حديث لـ Flutter، طورته Google ليحل محل Skia ومعالجة مشكلاته الأساسية: تأخيرات التظليل (jank) أثناء عرض الإطارات الأول، والاستهلاك العالي للذاكرة، وتعقيد دعم الخلفيات الرسومية المختلفة. على عكس Skia، يقوم Impeller بتجميع التظليلات مسبقاً (offline)، ويستخدم SPIR-V كتمثيل وسيط، ويعمل مباشرة مع Vulkan وMetal وDirect3D 12. وفقاً لفريق Flutter (2025)، Impeller يزيل ما يصل إلى 95% من تأخيرات التظليل، مما يوفر 60 إطاراً في الثانية بشكل متوقع حتى على الأجهزة منخفضة المستوى.
الخلاصة
Impeller هو محرك عرض رسومي مفتوح المصدر مكتوب بلغة C++، طوره فريق Flutter ليحل محل Skia كمحرك عرض أساسي. تم الإعلان عن المشروع في 2021 كاستجابة لمشكلة تأخيرات التظليل المزمنة التي يعاني منها Skia. Impeller ليس fork من Skia — بل هو تطبيق جديد تماماً صُمم مع مراعاة قيود GPU المحمولة وواجهات برمجة التطبيقات الرسومية الحديثة.
الفكرة الرئيسية لـ Impeller هي نقل تجميع التظليلات إلى مرحلة بناء التطبيق بدلاً من وقت التشغيل. في Skia، يتم تجميع التظليلات عند أول استخدام، عندما يكون المستخدم قد بدأ بالفعل في التفاعل مع التطبيق. Impeller يجمّع جميع التظليلات مسبقاً (offline)، ويحزمها في تنسيق SPIR-V الثنائي، ويوزعها مع التطبيق. أثناء التشغيل، يقوم Impeller بتحميل التظليلات المجمعة مسبقاً، مما يلغي تأخيرات التجميع.
كما يحل Impeller مشكلة استهلاك الذاكرة. ينشئ Skia العديد من الكائنات المؤقتة (القوام، المخازن المؤقتة) أثناء العرض، مما يؤدي إلى تجزئة الذاكرة على الأجهزة محدودة الموارد. Impeller يستخدم مجمعات الذاكرة ويعيد استخدام الموارد المخصصة، مما يقلل ذروة استهلاك الذاكرة بنسبة 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، وتنفيذ التظليلات. تتيح هذه النمطية إضافة دعم لواجهات برمجة تطبيقات رسومية جديدة بسهولة.
الطبقة السفلية هي تجريد فوق واجهة برمجة التطبيقات الرسومية (Vulkan، Metal، Direct3D 12). لا يدعم Impeller OpenGL، لأن OpenGL لا يوفر إمكانيات للتجميع المسبق الفعال للتظليلات. في هذا المستوى يتم تنفيذ: إدارة مخازن القمم، إنشاء وتخزين خطوط الأنابيب، ومزامنة GPU. خط الأنابيب في Impeller هو حالة GPU مجمعة مسبقاً تشمل التظليلات وإعدادات التنقيط والمزج. يتم إنشاء جميع خطوط الأنابيب أثناء مرحلة التهيئة، مما يلغي التجميع أثناء العرض.
الطبقة الوسطى هي نظام إدارة الموارد. تقوم بتخصيص وإعادة استخدام موارد GPU: القوام، المخازن المؤقتة، العينات. بدلاً من إنشاء نسيج جديد في كل إطار، يحتفظ Impeller بمجمع من القوام بأحجام وتنسيقات مختلفة. مجمع الذاكرة يعيد تلقائياً الموارد غير المستخدمة ويمكنه التوسع عند الحاجة، ولكن دون التجزئة المميزة لـ Skia.
الطبقة العليا هي الرسم البياني للعرض، الذي يحول فيه Flutter Engine أوامر Canvas API. يستقبل Impeller قائمة العرض (Display List) ويبني منها رسم بياني لتبعيات العمليات. يتم تحسين الرسم البياني: إزالة تمريرات العرض الزائدة، دمج العمليات ذات حالة GPU نفسها. ثم يتم تجميع الرسم البياني إلى سلسلة من استدعاءات Vulkan/Metal باستخدام خطوط الأنابيب المنشأة مسبقاً.
يمر كل إطار عبر خط أنابيب ثابت: قائمة العرض → رسم بياني للعرض → تجميع الرسم البياني → إرسال أوامر GPU. يمكن إضافة تمريرات إضافية للتأثيرات اللاحقة (الضبابية، الظلال) أو لتحضير مخزن العمق. وقت الإطار في Impeller أكثر توقعاً منه في Skia، حيث لا توجد تأخيرات غير محددة بسبب تجميع التظليلات.
تكشف مقارنة Impeller وSkia عن اختلافات في نهج العرض. Skia هي مكتبة ثنائية الأبعاد عامة للأغراض العامة، بينما Impeller هو محرك متخصص لـ Flutter، محسّن لمتطلبات واجهات المستخدم المحمولة.
| المعامل | Skia | Impeller |
|---|---|---|
| التظليلات | تجميع أثناء التشغيل (runtime) | تجميع مسبق (وقت البناء) |
| تأخير التظليل | 50–200 مللي ثانية في أول إطار | غائب (0 مللي ثانية) |
| تنسيق التظليلات | خاص (SkSL) | SPIR-V (عالمي) |
| خلفيات GPU | OpenGL، Vulkan، Metal | Vulkan، Metal، Direct3D 12 |
| استهلاك الذاكرة | مرتفع (قوام مؤقتة) | مجمعات ذاكرة، حتى -40% |
| المنصات | Android، iOS، Web، سطح المكتب | Android، iOS، سطح المكتب |
| الحالة | مستقر (رئيسي) | معاينة (استبدال Skia) |
الفرق الرئيسي هو نهج التظليلات. يقوم Skia بتجميع التظليلات في لحظة الاستخدام، مما يخلق تأخير تظليل عند عرض تأثيرات غير مألوفة لأول مرة. يزيل Impeller ذلك من خلال التجميع المسبق. كما أن Skia يدعم OpenGL، وهو ضروري لإصدار Flutter على الويب، لكن Impeller يتخلى عن OpenGL لصالح واجهات برمجة تطبيقات أكثر حداثة، مما يوفر أداءً أفضل على الأجهزة المحمولة.
لتطبيقات Flutter، لا يتطلب الانتقال إلى Impeller تغيير الكود. ينفذ Impeller نفس Canvas API مثل Skia، لذلك جميع الأدوات والعناصر والرسوم المتحركة والرسومات المخصصة تعمل بنفس الطريقة. التوافق العكسي مضمون على مستوى Flutter Engine — يختار المحرك العارض (Skia أو Impeller) في مرحلة تهيئة التطبيق.
يقدم Impeller عدة مزايا قابلة للقياس مقارنة بـ Skia، تؤثر مباشرة على تجربة المستخدم وأداء تطبيقات Flutter.
تأخيرات التظليل هي المشكلة الرئيسية لـ Skia التي يحلها Impeller تماماً. عندما يعرض تطبيق Flutter شاشة جديدة بتدرجات أو أقنعة أو مزجات غير قياسية، يقوم Skia بتجميع التظليلات أثناء الحركة، مما يؤدي إلى فقدان الإطارات. Impeller يجمّع جميع التظليلات في مرحلة البناء، لذلك يتم عرض أول إطار بنفس سرعة الإطارات التالية. على الأجهزة ذات GPU البطيء (MediaTek Helio، Qualcomm series 400)، يكون الفرق ملحوظاً بشكل خاص — يصل إلى 200 مللي ثانية تأخير لكل نوع تأثير جديد في Skia مقابل 0 مللي ثانية في Impeller.
يستخدم Impeller مجمعات الموارد لإدارة ذاكرة GPU. في Skia، قد ينشئ كل إطار قواماً جديدة للأسطح المؤقتة، خاصة عند العرض بالشفافية أو استخدام saveLayer. يعيد Impeller استخدام القوام بين الإطارات، مما يقلل ذروة استهلاك الذاكرة بنسبة 30–40% على Android وحتى 25% على iOS. هذا مهم بشكل خاص للتطبيقات ذات القوائم الطويلة والرسوم المتحركة، حيث يمكن أن يتسبب Skia في أخطاء نفاد الذاكرة على الأجهزة ذات 2 غيغابايت من RAM.
في Skia، يمكن أن يختلف وقت عرض الإطار اعتماداً على التظليلات التي تم تجميعها بالفعل. قد يستغرق أول إطار بتأثير جديد 50–200 مللي ثانية، بينما تستغرق الإطارات التالية 3–5 مللي ثانية. هذا عدم التوقع يعقد التحسين والاختبار. يضمن Impeller وقت إطار ثابت، لأن جميع التظليلات قد تم تجميعها بالفعل وتخصيص الذاكرة متوقع. يمكن لـ Flutter Engine مع Impeller حساب ميزانية الوقت لكل إطار بدقة أكبر.
يعمل Impeller مباشرة مع Vulkan (Android) وMetal (iOS) وDirect3D 12 (Windows)، دون طبقة OpenGL. يوفر هذا عدة مزايا: زمن انتقال أقل للسائق (حتى 50% أقل من خلال OpenGL)، تحكم مباشر في ذاكرة GPU، والوصول إلى إمكانيات حديثة (هندسة GPU المبلطة، العرض بقيادة GPU). 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، 92% من تطبيقات iOS تعمل على Impeller دون تراجعات مرئية، ويتحسن أداء الحركة بنسبة 25–40%.
على Android، يعمل Impeller عبر Vulkan. للتفعيل، تُضاف العلامة الوصفية io.flutter.embedded_views_preview في AndroidManifest.xml. يواصل فريق 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)، وتأخيرات التظليل ليست مشكلة حرجة له بسبب آلية تجميع تظليلات مختلفة في المتصفح. إصدار الويب سيستمر في استخدام Skia.
نشرت Google خارطة طريق Impeller: 2024 — Impeller افتراضياً على iOS؛ 2025 — Impeller افتراضياً على Android وWindows؛ 2026 — الإزالة الكاملة لـ Skia من Flutter Engine. بعد ذلك، سيستخدم Flutter Impeller كمحرك عرض وحيد، مما يبسط الصيانة ويقلل حجم المحرك ويحسن الأداء على جميع المنصات.
الأسئلة الشائعة
على iOS، Impeller مفعل افتراضياً منذ Flutter 3.16. على Android، أضف العلامة الوصفية io.flutter.embedded_views_preview بالقيمة true في AndroidManifest.xml. على Windows، استخدم العلامة --enable-impeller عند التشغيل. في جميع الحالات، يمكن التفعيل الإجباري عبر FlutterEngine في كود Dart.
Skia يعمل، لكن لديه مشكلات أساسية: تأخيرات التظليل (50–200 مللي ثانية تأخير لتجميع التظليلات)، استهلاك عالي للذاكرة، وقيود بنية OpenGL. Impeller مصمم خصيصاً لـ Flutter ويحل هذه المشكلات من خلال التجميع المسبق للتظليلات ومجمعات الذاكرة.
نعم، ينفذ Impeller نفس Canvas API مثل Skia. جميع أدوات Flutter القياسية — النصوص والصور والرسوم المتحركة والرسومات المخصصة — تعمل على Impeller دون تغييرات. التوافق العكسي مضمون على مستوى Flutter Engine، والانتقال شفاف للمطور.
لا، يستخدم التطبيق محرك عرض واحد في كل مرة. يتم الاختيار عند تهيئة Flutter Engine عبر علامة. التبديل بين Skia وImpeller أثناء تشغيل التطبيق غير ممكن — العارض يثبت حتى إنشاء أول مثيل لـ FlutterEngine.
سيستمر Skia في الوجود كمكتبة مستقلة من Google لـ Chrome وAndroid ومشاريع أخرى. في Flutter، سيتم استبدال Skia بـ Impeller كعارض رئيسي. Skia سيبقى لإصدار Flutter على الويب (عبر CanvasKit) وكخيار احتياطي للأجهزة دون دعم Vulkan/Metal.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.