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 إلا في السياقات الآمنة. إذا كنت تعرض الرمز البرمجي عبر بروتوكول غير آمن (مثل 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 في Headless Chrome للاطّلاع على مزيد من المعلومات.

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

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

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

  6. تعطّلت عملية وحدة معالجة الرسومات عدة مرات. يمكنك إعادة تحميل الصفحة أو إعادة تشغيل Chrome. اطّلِع على أفضل الممارسات المتعلّقة بفقدان جهاز WebGPU للتعرّف على مزيد من المعلومات.

WebGPU أبطأ من WebGL.

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

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

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

يُرجى مراعاة القيود التالية عند استخدام WebGPU على أجهزة Windows:

  • لا يتيح Chrome استخدام عدة محولات لوحدات معالجة الرسومات في الوقت نفسه. يُرجى الاطّلاع على issue chromium:329211593.

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