تكرار السؤال: …
الإجابة المختصرة
طور Impeller للتخلص التام من تقطيع الفريمات (Jank) الناتج عن ترجمة الـ Shaders وقت التشغيل لأول مرة في Skia، وذلك عبر ترجمة وتجميع جميع الـ Shaders مسبقاً في وقت بناء التطبيق (AOT).
الشرح
في محرك Skia التقليدي، عندما يواجه التطبيق تأثيراً بصرياً أو حركة لأول مرة (مثل ظل جديد أو تدرج لوني معقد)، يتوقف خيط الرسم لترجمة كود الـ Shader إلى كود لغة الآلة لبطاقة الرسوميات (GPU Driver compilation)، مما يستغرق أحياناً مئات المللي ثواني ويسقط الفريمات. يحل Impeller هذه المشكلة بالكامل عن طريق تجميع كل الـ Shaders والـ pipelines مسبقاً في وقت الترجمة (AOT compilation)، مع استخدام مباشر لـ Metal على iOS و Vulkan على Android، واستخدام أفضل للـ concurrency وتعدد خيوط المعالجة.
مثال بالكود
import 'dart:ui' as ui;
// Shaders written for Impeller are compiled ahead of time when the app is built,
// so the first frame that uses them does not stall the GPU driver.
Future<ui.FragmentShader> loadRipple(double progress) async {
final program = await ui.FragmentProgram.fromAsset('shaders/ripple.frag');
return program.fragmentShader()..setFloat(0, progress);
}
// Android: opt out of Impeller only to compare against Skia while debugging
// (AndroidManifest.xml):
// <meta-data android:name="io.flutter.embedding.android.EnableImpeller" android:value="false" />
// iOS has used Impeller by default since Flutter 3.10; Android (Vulkan devices) since Flutter 3.27.أخطاء شائعة
- الاعتقاد بأن حل مشكلة تقطيع الـ Shaders في Skia كان عبر زيادة قوة الهاتف، بينما المشكلة بنيوية في طريقة الترجمة اللحظية للـ GPU Pipelines.