almessadi.
العودة إلى الفهرس

WebAssembly لأعباء العمل المرئية: أين يساعد_

يمكن أن يجعل WebAssembly معالجة الوسائط على جانب المتصفح ممكنة، ولكن فقط إذا أدرت حركة البيانات، والخيوط، وواجهات برمجة المتصفح بعناية.

تاريخ النشر24 مارس 2024
وقت القراءة10 min read

WebAssembly جذاب لميزات المتصفح الثقيلة في الوسائط لأنه يوفر لك وسيلة لتشغيل كود مكثف الحوسبة دون إعادة كتابة التطبيق بالكامل بعيدًا عن منصة الويب.

هذا لا يعني "نقل برنامج الترميز إلى Rust وكل شيء يصبح سريعًا."

بالنسبة لأعباء العمل المرئية، عادةً ما يكون الجزء الصعب هو ليس مجرد حسابات خام. بل هو:

  • نقل المخازن الكبيرة
  • تنسيق العمل خارج الخيط الرئيسي
  • العمل ضمن حدود الذاكرة في المتصفح
  • اختيار الوقت المناسب لاستخدام واجهات برمجة التطبيقات الخاصة بالمنصة بدلاً من منافذ WASM العامة

ما هو جيد في WASM

يكون WebAssembly منطقيًا عندما يكون لديك مسار ساخن هو:

  • عددي
  • متكرر
  • سهل العزل عن واجهة المستخدم

يشمل ذلك أجزاء من:

  • تحويلات الصور
  • تحليل الموجات
  • خطوط أنابيب التشفير
  • تأثيرات إطار بإطار

إنه أقل فائدة بكثير إذا كان عنق الزجاجة هو إدخال / إخراج الملفات، أو رفع الشبكة، أو العمل على DOM حول المحرر.

الحد هو التكلفة الحقيقية

غالبًا ما تركز الفرق على "Rust أسرع من JavaScript" وتفوت السؤال الأكثر أهمية:

"كم مرة نقوم بنسخ البيانات عبر الحد الفاصل بين JS/WASM؟"

إذا كانت كل مرحلة تقوم بنسخ المخازن الكبيرة للإطارات ذهابًا وإيابًا، فإن الأداء يتدهور بسرعة.

نمط أكثر واقعية هو:

  • قراءة المدخلات في كتل
  • الاحتفاظ بالدورة الساخنة داخل WASM أو عامل
  • تجنب الرحلات غير الضرورية بين JS و WASM

حتى وحدة WASM جيدة يمكن أن تشعر بالبطء إذا كانت خطوط الأنابيب المحيطة تعيد تخصيص ونسخ البيانات باستمرار.

فضل واجهات برمجة التطبيقات الخاصة بالمنصة عند وجودها

تعمل الوسائط في المتصفح بشكل أفضل اليوم مما كانت عليه سابقًا.

قبل أن تصل إلى نقل برنامج ترميز كامل، تحقق مما إذا كان بإمكان المتصفح القيام بجزء من الوظيفة نيابةً عنك:

  • WebCodecs لعمليات التشفير/فك التشفير
  • OffscreenCanvas للرسم على جانب العامل
  • Web Workers للعزل عن الخيط الرئيسي

لا يزال WASM مهمًا. إنه ببساطة لم يعد الخيار الجاد الوحيد.

إذا كان دعم المتصفح مقبولاً لجمهورك، يمكن أن يكون WebCodecs خيارًا أفضل من الشحن بأداة ترميز ضخمة إلى كل عميل.

شكل التكامل العملي

يجب أن تبقى واجهة المستخدم في المتصفح رفيعة:

const worker = new Worker(new URL("./encoder.worker.ts", import.meta.url), {
  type: "module",
});

worker.postMessage({
  file,
  settings: { start: 10, end: 25, bitrate: 2_000_000 },
});

ثم ضع العمل الثقيل خلف حدود العامل واحتفظ بالخيط الرئيسي متركزًا على المحرر.

داخل العامل، القاعدة المفيدة بسيطة:

  • فك التشفير أو التحويل هناك
  • احتفظ بالمخازن الوسيطة محلية
  • أعد أحداث التقدم، وليس كائنات وسيطة ضخمة

عندما يكون WASM الخيار الصحيح

يستحق WASM تعقيده عندما:

  • لديك بالفعل مكتبة أصلية ناضجة
  • تهم الأداء بما يكفي لتبرير تعقيد البناء الإضافي
  • عبء العمل هو في الغالب معالجة حسابية، وليس واجهة مستخدم

إنه ليس مناسبًا عندما:

  • تغطي واجهات برمجة التطبيقات في المتصفح الحاجة بالفعل
  • حجم الحزمة مقيد بشدة
  • لا يمكن أن يتحمل المنتج تباين الميزات في المتصفح

WASM قوي لأنه يمنح الويب مخرج برمجة الأنظمة. إنه ليس تصريحًا مجانيًا حول قرارات المعمارية.

قراءة إضافية