labZero:~$ cd ./lab / lab-flutter-method-vs-ev...
MethodChannel في Flutter: تكلفة الاتصال بين Dart والـ native
استدعاء MethodChannel 30 مرة/ثانية لتحديث UI الكاميرا أضاف 18ms تأخيراً — EventChannel حلّها بـ 2ms.
السياق
إضافة AR overlay فوق preview الكاميرا في تطبيق Flutter. كل frame، Dart يستدعي MethodChannel لجلب إحداثيات face detection من native. على Pixel 6: 18ms إضافية لكل استدعاء، الـ UI يتأخر بصرياً رغم أن الكاميرا بـ 60fps.
الإجراء
Profile في DevTools: method_channel_invoke يظهر كل 33ms على Main thread. اختبرت ثلاث بدائل: (1) EventChannel — native يبث البيانات، Dart يستمع بدون polling، (2) BasicMessageChannel مع binary codec لتقليل serialization overhead، (3) dart:ffi مع shared memory لبيانات الـ frame كاملة. قست كل خيار على 100 frame متتالي وسجّلت متوسط الزمن والأثر على Main thread.
النتيجة
MethodChannel: متوسط 18ms/استدعاء، يحجب Main thread. EventChannel: 2ms — native يتحكم في التوقيت، Dart يستمع فقط، لا blocking. dart:ffi: 0.3ms لكن يتطلب native code معقداً وإدارة ذاكرة يدوية. EventChannel كان التوازن الأمثل بين الأداء والبساطة.
الدرس
MethodChannel للأوامر المنفردة والنادرة، EventChannel للبيانات المتدفقة — اختر الـ channel حسب نمط الاتصال لا حسب ما يظهر أولاً في التوثيق.
هل تشبه فكرتك هذا المشروع؟ باب التعاون من هنا ‹