WebGPU: نصائح عن تحديد المشاكل وحلّها

François Beaufort
François Beaufort

يوضح هذا المستند سبب عدم عمل WebGPU أو عدم عمله على النحو المتوقَّع في متصفِّح Chrome، مع تقديم خطوات واضحة لحل المشاكل حيثما أمكن.

يوضّح المثال التالي خطأ JavaScript قد يظهر لك عند عدم توفّر gpu في navigator:

const adapter = await navigator.gpu.requestAdapter();
cancel Uncaught TypeError: Cannot read properties of undefined (reading 'requestAdapter')

وقد يرجع ذلك إلى أحد الأسباب التالية. تحقق من هذه الخيارات بالترتيب المحدد:

  1. تتطلّب واجهة برمجة التطبيقات WebGPU استخدام الإصدار 113 من Chrome أو الإصدارات الأحدث على أنظمة التشغيل ChromeOS وmacOS وWindows وChrome 121 أو الإصدارات الأحدث على أنظمة التشغيل Android. تحقق من الإصدار على chrome://version وقم بتحديثه إذا لزم الأمر.

  2. لا يمكن حاليًا الوصول إلى WebGPU من أحد مشغّلي الخدمات أو عاملين مشترَكين. في حال الاستعانة بمشغِّل خدمات أو عامل مشترك، عليك نقل رمز WebGPU إلى عامل مخصَّص أو إلى سياق النافذة العامة.

  3. لا يمكن الوصول إلى WebGPU إلا من خلال السياقات الآمنة. إذا كنت تعرض الرمز عبر بروتوكول غير آمن (على سبيل المثال، http: أو file:)، يمكنك استخدام بروتوكول https: الآمن أو معالجة ذلك أثناء تطوير تطبيق الويب بإحدى الطرق التالية:

    • يمكنك عرض الرمز محليًا على http://localhost أو http://127.0.0.1 باستخدام أي من هذين الأمرَين: npx http-server أو python3 -m http.server.

    • أضِف المصدر إلى قائمة "المصادر غير الآمنة التي تم التعامل معها على أنّها آمنة" الخاصة بـ chrome://flags/#unsafely-treat-insecure-origin-as-secure وأعِد تشغيل Chrome.

    • ثبِّت Node.js وشغِّل npx servez --ssl لعرض المجلد عبر https باستخدام شهادة مزيفة. وسيستمر ظهور تحذير في Chrome يمكنك تجاوزه بالنقر على "إعدادات متقدمة" ثم على "المتابعة إلى...".

    • اعرض خادم الويب المحلي على الإنترنت باستخدام ngrok.

محوّل وحدة معالجة الرسومات فارغ

في ما يلي مثال على خطأ JavaScript قد يحدث عندما يكون المحوِّل الذي تحصل عليه من استدعاء requestAdapter() فارغًا:

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
cancel Uncaught TypeError: Cannot read properties of undefined (reading requestDevice)

ويحدث ذلك لأحد الأسباب التالية. تحقق من هذه الخيارات بالترتيب المحدد:

  1. يتم إيقاف WebGPU عندما يوقِف المستخدم ميزة "استخدام تسريع الرسومات عند توفُّرها" في chrome://settings/system. التأكد ممّا إذا كان هذا الخيار غير مفعَّل وإعادة تفعيله

  2. تنسيق WebGPU غير متوافق مع هذا النظام الأساسي حتى الآن. يمكنك تفعيل العلامة chrome://flags/#enable-unsafe-webgpu وإعادة تشغيل Chrome. بالنسبة إلى الدعم التجريبي لنظام التشغيل Linux، عليك أيضًا تفعيل العلامة chrome://flags/#enable-vulkan. اطّلِع على دعم WebGPU في Chrome بلا واجهة مستخدم رسومية لمزيد من المعلومات.

  3. لقد تم حظر أجهزة وحدة معالجة الرسومات على وجه التحديد. إذا ظهرت لك رسالة "تم إيقاف WebGPU من خلال القائمة المحظورة أو سطر الأوامر" في chrome://gpu، يمكنك إيقاف القائمة المحظورة لمحوّلات WebGPU من خلال تفعيل العلامة chrome://flags/#enable-unsafe-webgpu ثم إعادة تشغيل Chrome.

  4. ما مِن محوِّل وحدة معالجة رسومات مطابق للخيارات التي تم تمريرها في requestAdapter(). جرِّب الاتصال بالرقم requestAdapter() باستخدام خيارات مختلفة.

  5. تتطلّب WebGPU وحدة معالجة رسومات (إما أجهزة أو برامج في وضع محاكاة). يمكنك التحقق مما إذا كان Chrome اكتشف وحدة معالجة رسومات من خلال الانتقال إلى chrome://gpu.

WebGPU أبطأ من WebGL

  1. افتح chrome://gpu وتأكَّد من أنّه يمكنك قراءة "WebGPU: تسريع الأجهزة". إذا ظهرت لك الرسالة "WebGPU: البرامج فقط، لا يتوفّر تسريع الأجهزة"، قد تحتاج إلى تحديث برامج تشغيل وحدة معالجة الرسومات.

  2. قد لا تستفيد ترجمة مفاهيم WebGL بشكل مباشر إلى WebGPU من التحسينات الفريدة في WebGPU بشكل كامل. راجِع من WebGL إلى WebGPU للتعرّف على بعض الاختلافات بينهما.

القيود الخاصة بنظام التشغيل Windows

انتبِه إلى القيود التالية عند استخدام WebGPU على أجهزة تعمل بنظام التشغيل Windows:

  • لا يسمح Chrome باستخدام محوّلات متعددة لوحدة معالجة الرسومات في وقتٍ واحد. راجِع المشكلة chromium:329211593.

  • يستخدم Chrome دائمًا محوّل وحدة معالجة الرسومات نفسه الذي تم تخصيصه لأعباء العمل الأخرى في Chrome، والتي تكون بشكل عام بطاقة الرسومات المدمجة في أجهزة الكمبيوتر المحمولة، بسبب جانب استخدام الطاقة (أي توفير الطاقة). ويعني هذا أنّه لن يكون للخيار powerPreference أي تأثير عند طلب الرقم requestAdapter().