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 والإصدار 121 من Chrome أو إصدار أحدث على 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 استخدام عدة محولات وحدات معالجة الرسومات في الوقت نفسه. يُرجى الاطّلاع على المشكلة chromium:329211593.

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