I'm always excited to take on new projects and collaborate with innovative minds.

Phone

+20 115 052 9992

Website

https://ibrahimahmed.online/

Social Links

محرك الرندر Impeller في Flutter: وداعاً لمشكلة الـ Janky Animations والتقطيع

محرك الرندر Impeller في Flutter: وداعاً لمشكلة الـ Janky Animations والتقطيع لو كنت مبرمج فلاتر (Flutter Developer) وشغال على تطبيق تقيل شوية، أكيد مريت باللحظة

محرك الرندر Impeller في Flutter: وداعاً لمشكلة الـ Janky Animations والتقطيع
Reading Count: 5

محرك الرندر Impeller في Flutter: وداعاً لمشكلة الـ Janky Animations والتقطيع

لو كنت مبرمج فلاتر (Flutter Developer) وشغال على تطبيق تقيل شوية، أكيد مريت باللحظة اللي "بتوجع القلب" دي: بتعمل سكرول (Scroll) أو بتفتح شاشة جديدة فيها انيميشن (Animation) وفجأة التطبيق بيقطع (Frame Drop) أو بيحصل "تتيعة" بسيطة. المشكلة دي كانت كابوس فلاتر لسنوات، وعارفينها باسم Shader Compilation Jank. النهاردة هنتكلم عن البطل الجديد اللي جه ينهي المعاناة دي: محرك الرندر Impeller.

إيه هي مشكلة الـ Shader Compilation Jank؟

عشان نفهم العظمة اللي عملها Impeller، لازم نعرف إحنا كنا بنعاني من إيه. محرك الرندر القديم (Skia) كان بيعتمد على تجميع الـ Shaders (وهي كود بيتحكم في كارت الشاشة GPU) في وقت التشغيل (Runtime). يعني إيه؟ يعني لما التطبيق بتاعك يقرر فجأة إنه يرسم حاجة جديدة ومختلفة (زي Shadow أو Gradient معقد)، الـ GPU بيقول "أنا معرفش أرسم ده لسه، استنوا عليا أعمل Compile للكود".

العملية دي بتحصل في "جزء من الثانية"، وده اللي بيسبب الـ Lag اللي بنشوفه. فلاتر كان بيحاول يعمل Pre-compile، بس الموضوع كان شبه مستحيل يغطي كل الاحتمالات الممكنة، فكانت النتيجة دايماً فيه تقطيع في أول مرة تشغل فيها الانيميشن.

محرك Impeller: كيف أنقذ الموقف؟

جوجل قررت إنها مش هتقدر تصلح Skia عشان يواكب متطلبات الجرافيكس الحديثة، فقررت تبني محرك رندر من الصفر: Impeller. الفكرة الجوهرية هنا هي Ahead-of-Time (AOT) Compilation للـ Shaders.

بدل ما الموبايل يقعد "يفكر" ويرسم الـ Shaders وهو شغال، Impeller بيعمل ده كله وقت ما بتعمل Build للتطبيق بتاعك. بيحلل كل الـ Shaders المحتملة وبيحولها لشكل مفهوم لكارت الشاشة قبل ما المستخدم حتى يفتح التطبيق. ده معناه إن الـ GPU جاهز ومستعد ينفذ أي انيميشن من أول Frame بدون أي تردد.

الفرق التقني الجوهري بين Skia و Impeller

  • التحكم في الذاكرة (Memory Management): Impeller بيستخدم نظام تخصيص ذاكرة (Buffer Management) أكثر ذكاءً وأسرع بكتير.
  • توافق مع الـ APIs الحديثة: المحرك الجديد مصمم عشان يتواصل بشكل مباشر مع Metal على iOS و Vulkan على Android، وده بيقلل الـ Overhead (الضغط) على المعالج الرئيسي CPU.
  • الاستقرار (Predictability): بما إن مفيش تجميع للـ Shaders وقت التشغيل، فأداء الانيميشن بقى ثابت (Constant Frame Rate) ومفيش مفاجآت.

هل محتاج تعمل كود معين عشان تستخدم Impeller؟

الجميل في الموضوع إنك كمبرمج، مش محتاج تغير منطق الكود بتاعك. فلاتر أخدت الموضوع ده على عاتقها. لو عايز تتأكد إن تطبيقك بيستخدم Impeller، تقدر ببساطة تضيف Flag في أمر التشغيل، لكن في النسخ الحديثة، Impeller بقى هو الوضع الافتراضي (Default) على iOS، وشغالين بقوة على تعميمه بالكامل على Android.

عشان تشوف الـ Performance، جرب تشغل التطبيق بـ Profile Mode:

flutter run --profile --enable-impeller

نصيحة من أخ لمبرمج فلاتر

التكنولوجيا بتتطور بسرعة، والنهارده Impeller بيحل مشاكل كنا فاكرينها مستحيلة. نصيحتي ليك، دايماً تابع الـ Release Notes بتاعة Flutter، لأن التحديثات دي هي اللي بتنقل شغلك من مجرد "تطبيق شغال" لـ "تطبيق احترافي" بينافس التطبيقات Native. متكتفيش بس بالـ Widgets، حاول تفهم إزاي المحرك بيشتغل من جوه، ده اللي هيخليك "سينيور" حقيقي في سوق العمل.

لو عندك أي سؤال عن الـ Rendering Pipeline أو حابب نتناقش في تجاربك مع الأداء (Performance)، سيب لي تعليق تحت!


Share

Related posts

Jun 20, 2026 • 1 min read
Reading Count: 7
إزاي تشغل تطبيقات فلاتر (Flutter) على الويب بسرعة خرافية باستخدام ويب اسمبلي (WebAssembly)؟

إزاي تشغل تطبيقات فلاتر (Flutter) على الويب بسرعة خرافية باستخدام ويب اسمبلي (WebAssembly)؟ لو أنت م...

Jun 20, 2026 • 1 min read
Reading Count: 6
إزاي تسرع تطبيقات Angular بذكاء باستخدام Deferrable Views؟

إزاي تسرع تطبيقات Angular بذكاء باستخدام Deferrable Views؟ أكيد مريت بالموقف ده: بتبني تطبيق Angular...

Jun 17, 2026 • 1 min read
Reading Count: 13
إدارة الحالة (State Management) في أنجلر بدون وجع دماغ RxJS: دليل استخدام Angular Signals

إدارة الحالة (State Management) في أنجلر بدون وجع دماغ RxJS: دليل استخدام Angular Signals لو كنت مبر...