Impeller: المفاهيم الأساسية والبنية والمزايا

المؤلف: IT Sectr نُشر: 2026-06-04 وقت القراءة: 9 دق

Impeller هو محرك عرض حديث لـ Flutter، طورته Google ليحل محل Skia ومعالجة مشكلاته الأساسية: تأخيرات التظليل (jank) أثناء عرض الإطارات الأول، والاستهلاك العالي للذاكرة، وتعقيد دعم الخلفيات الرسومية المختلفة. على عكس Skia، يقوم Impeller بتجميع التظليلات مسبقاً (offline)، ويستخدم SPIR-V كتمثيل وسيط، ويعمل مباشرة مع Vulkan وMetal وDirect3D 12. وفقاً لفريق Flutter (2025)، Impeller يزيل ما يصل إلى 95% من تأخيرات التظليل، مما يوفر 60 إطاراً في الثانية بشكل متوقع حتى على الأجهزة منخفضة المستوى.

الخلاصة

  • Impeller — محرك عرض جديد لـ Flutter يحل محل Skia
  • التجميع المسبق للتظليلات يزيل تأخيرات التظليل عند أول عرض
  • البنية تستخدم SPIR-V كتمثيل وسيط عالمي
  • الخلفيات يعمل Impeller مباشرة مع Vulkan وMetal وDirect3D 12
  • الأداء متوقع بفضل المعالجة المسبقة لجميع التظليلات

ما هو Impeller؟

Impeller هو محرك عرض رسومي مفتوح المصدر مكتوب بلغة C++، طوره فريق Flutter ليحل محل Skia كمحرك عرض أساسي. تم الإعلان عن المشروع في 2021 كاستجابة لمشكلة تأخيرات التظليل المزمنة التي يعاني منها Skia. Impeller ليس fork من Skia — بل هو تطبيق جديد تماماً صُمم مع مراعاة قيود GPU المحمولة وواجهات برمجة التطبيقات الرسومية الحديثة.

الفكرة الرئيسية لـ Impeller هي نقل تجميع التظليلات إلى مرحلة بناء التطبيق بدلاً من وقت التشغيل. في Skia، يتم تجميع التظليلات عند أول استخدام، عندما يكون المستخدم قد بدأ بالفعل في التفاعل مع التطبيق. Impeller يجمّع جميع التظليلات مسبقاً (offline)، ويحزمها في تنسيق SPIR-V الثنائي، ويوزعها مع التطبيق. أثناء التشغيل، يقوم Impeller بتحميل التظليلات المجمعة مسبقاً، مما يلغي تأخيرات التجميع.

كما يحل Impeller مشكلة استهلاك الذاكرة. ينشئ Skia العديد من الكائنات المؤقتة (القوام، المخازن المؤقتة) أثناء العرض، مما يؤدي إلى تجزئة الذاكرة على الأجهزة محدودة الموارد. Impeller يستخدم مجمعات الذاكرة ويعيد استخدام الموارد المخصصة، مما يقلل ذروة استهلاك الذاكرة بنسبة 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، وتنفيذ التظليلات. تتيح هذه النمطية إضافة دعم لواجهات برمجة تطبيقات رسومية جديدة بسهولة.

الطبقة السفلية هي تجريد فوق واجهة برمجة التطبيقات الرسومية (Vulkan، Metal، Direct3D 12). لا يدعم Impeller OpenGL، لأن OpenGL لا يوفر إمكانيات للتجميع المسبق الفعال للتظليلات. في هذا المستوى يتم تنفيذ: إدارة مخازن القمم، إنشاء وتخزين خطوط الأنابيب، ومزامنة GPU. خط الأنابيب في Impeller هو حالة GPU مجمعة مسبقاً تشمل التظليلات وإعدادات التنقيط والمزج. يتم إنشاء جميع خطوط الأنابيب أثناء مرحلة التهيئة، مما يلغي التجميع أثناء العرض.

الطبقة الوسطى هي نظام إدارة الموارد. تقوم بتخصيص وإعادة استخدام موارد GPU: القوام، المخازن المؤقتة، العينات. بدلاً من إنشاء نسيج جديد في كل إطار، يحتفظ Impeller بمجمع من القوام بأحجام وتنسيقات مختلفة. مجمع الذاكرة يعيد تلقائياً الموارد غير المستخدمة ويمكنه التوسع عند الحاجة، ولكن دون التجزئة المميزة لـ Skia.

الطبقة العليا هي الرسم البياني للعرض، الذي يحول فيه Flutter Engine أوامر Canvas API. يستقبل Impeller قائمة العرض (Display List) ويبني منها رسم بياني لتبعيات العمليات. يتم تحسين الرسم البياني: إزالة تمريرات العرض الزائدة، دمج العمليات ذات حالة GPU نفسها. ثم يتم تجميع الرسم البياني إلى سلسلة من استدعاءات Vulkan/Metal باستخدام خطوط الأنابيب المنشأة مسبقاً.

تدفق تنفيذ الإطار في Impeller

يمر كل إطار عبر خط أنابيب ثابت: قائمة العرض → رسم بياني للعرض → تجميع الرسم البياني → إرسال أوامر GPU. يمكن إضافة تمريرات إضافية للتأثيرات اللاحقة (الضبابية، الظلال) أو لتحضير مخزن العمق. وقت الإطار في Impeller أكثر توقعاً منه في Skia، حيث لا توجد تأخيرات غير محددة بسبب تجميع التظليلات.

مقارنة Impeller وSkia

تكشف مقارنة Impeller وSkia عن اختلافات في نهج العرض. Skia هي مكتبة ثنائية الأبعاد عامة للأغراض العامة، بينما Impeller هو محرك متخصص لـ Flutter، محسّن لمتطلبات واجهات المستخدم المحمولة.

المعاملSkiaImpeller
التظليلاتتجميع أثناء التشغيل (runtime)تجميع مسبق (وقت البناء)
تأخير التظليل50–200 مللي ثانية في أول إطارغائب (0 مللي ثانية)
تنسيق التظليلاتخاص (SkSL)SPIR-V (عالمي)
خلفيات GPUOpenGL، Vulkan، MetalVulkan، Metal، Direct3D 12
استهلاك الذاكرةمرتفع (قوام مؤقتة)مجمعات ذاكرة، حتى -40%
المنصاتAndroid، iOS، Web، سطح المكتبAndroid، iOS، سطح المكتب
الحالةمستقر (رئيسي)معاينة (استبدال Skia)

الفرق الرئيسي هو نهج التظليلات. يقوم Skia بتجميع التظليلات في لحظة الاستخدام، مما يخلق تأخير تظليل عند عرض تأثيرات غير مألوفة لأول مرة. يزيل Impeller ذلك من خلال التجميع المسبق. كما أن Skia يدعم OpenGL، وهو ضروري لإصدار Flutter على الويب، لكن Impeller يتخلى عن OpenGL لصالح واجهات برمجة تطبيقات أكثر حداثة، مما يوفر أداءً أفضل على الأجهزة المحمولة.

التوافق مع كود Flutter الحالي

لتطبيقات Flutter، لا يتطلب الانتقال إلى Impeller تغيير الكود. ينفذ Impeller نفس Canvas API مثل Skia، لذلك جميع الأدوات والعناصر والرسوم المتحركة والرسومات المخصصة تعمل بنفس الطريقة. التوافق العكسي مضمون على مستوى Flutter Engine — يختار المحرك العارض (Skia أو Impeller) في مرحلة تهيئة التطبيق.

مزايا 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 افتراضياً

على iOS، يعمل Impeller عبر Metal ومفعل افتراضياً منذ Flutter 3.16. يوصي فريق Flutter باختبار التطبيقات على Impeller والإبلاغ عن المشكلات. للعودة إلى Skia، يتم استخدام علامة Impeller في ملف Info.plist: FlutterEnableImpeller = NO. وفقاً لفريق Flutter، 92% من تطبيقات iOS تعمل على Impeller دون تراجعات مرئية، ويتحسن أداء الحركة بنسبة 25–40%.

Android: اختياري

على 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 كمحرك عرض وحيد، مما يبسط الصيانة ويقلل حجم المحرك ويحسن الأداء على جميع المنصات.

الأسئلة الشائعة

كيف يمكن تفعيل Impeller في Flutter؟

على iOS، Impeller مفعل افتراضياً منذ Flutter 3.16. على Android، أضف العلامة الوصفية io.flutter.embedded_views_preview بالقيمة true في AndroidManifest.xml. على Windows، استخدم العلامة --enable-impeller عند التشغيل. في جميع الحالات، يمكن التفعيل الإجباري عبر FlutterEngine في كود Dart.

لماذا استبدال Skia إذا كان يعمل؟

Skia يعمل، لكن لديه مشكلات أساسية: تأخيرات التظليل (50–200 مللي ثانية تأخير لتجميع التظليلات)، استهلاك عالي للذاكرة، وقيود بنية OpenGL. Impeller مصمم خصيصاً لـ Flutter ويحل هذه المشكلات من خلال التجميع المسبق للتظليلات ومجمعات الذاكرة.

هل يدعم Impeller جميع أدوات Flutter؟

نعم، ينفذ Impeller نفس Canvas API مثل Skia. جميع أدوات Flutter القياسية — النصوص والصور والرسوم المتحركة والرسومات المخصصة — تعمل على Impeller دون تغييرات. التوافق العكسي مضمون على مستوى Flutter Engine، والانتقال شفاف للمطور.

هل يمكن استخدام Skia وImpeller معاً؟

لا، يستخدم التطبيق محرك عرض واحد في كل مرة. يتم الاختيار عند تهيئة Flutter Engine عبر علامة. التبديل بين Skia وImpeller أثناء تشغيل التطبيق غير ممكن — العارض يثبت حتى إنشاء أول مثيل لـ FlutterEngine.

ماذا سيحدث لـ Skia بعد اعتماد Impeller؟

سيستمر Skia في الوجود كمكتبة مستقلة من Google لـ Chrome وAndroid ومشاريع أخرى. في Flutter، سيتم استبدال Skia بـ Impeller كعارض رئيسي. Skia سيبقى لإصدار Flutter على الويب (عبر CanvasKit) وكخيار احتياطي للأجهزة دون دعم Vulkan/Metal.

الملخص

  • Impeller — محرك عرض جديد لـ Flutter يزيل تأخيرات التظليل من خلال التجميع المسبق للتظليلات
  • البنية تعتمد على SPIR-V وخطوط أنابيب مجمعة مسبقاً ومجمعات ذاكرة
  • المقارنة مع Skia: لا تأخير في أول عرض، تقليل الذاكرة بنسبة 30–40%
  • الخلفيات تدعم Vulkan وMetal وDirect3D 12 دون OpenGL القديم
  • الحالة على iOS — افتراضي، على Android وWindows — اختياري (Flutter 3.16+)
  • التوافق كامل: جميع أدوات Flutter الحالية تعمل دون تغيير الكود
  • استخدم Impeller في مشاريع Flutter الجديدة ورحّل الحالية للقضاء على التأخيرات

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا