WebGPU: نکات و راه حل های عیب یابی

فرانسوا بوفور
François Beaufort

این سند توضیح می‌دهد که چرا WebGPU ممکن است در مرورگر Chrome غیرقابل اجرا باشد یا آنطور که انتظار می‌رود کار نکند، با گام‌های روشن برای حل مشکلات در صورت امکان.

مثال زیر یک خطای جاوا اسکریپت را نشان می دهد که ممکن است زمانی که gpu در navigator در دسترس نیست، دریافت کنید:

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

این ممکن است به دلیل یکی از دلایل زیر باشد. آنها را به این ترتیب خاص بررسی کنید:

  1. WebGPU به Chrome 113 یا بالاتر در 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 در معرض اینترنت قرار دهید.

آداپتور GPU پوچ است

در زیر نمونه‌ای از خطای جاوا اسکریپت است که ممکن است وقتی آداپتوری که از فراخوانی requestAdapter() دریافت می‌کنید، تهی باشد:

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

این به یکی از دلایل زیر رخ می دهد. آنها را به این ترتیب خاص بررسی کنید:

  1. وقتی کاربر «استفاده از شتاب گرافیکی در صورت موجود بودن» را در chrome://settings/system خاموش کرده باشد، WebGPU غیرفعال می‌شود. بررسی کنید که آیا این تنظیم خاموش است یا خیر و دوباره آن را روشن کنید

  2. WebGPU هنوز در این پلتفرم پشتیبانی نمی شود. می توانید پرچم chrome://flags/#enable-unsafe-webgpu فعال کرده و کروم را مجددا راه اندازی کنید. برای پشتیبانی آزمایشی لینوکس، باید پرچم chrome://flags/#enable-vulkan را نیز فعال کنید. برای کسب اطلاعات بیشتر ، پشتیبانی WebGPU را در Headless Chrome بررسی کنید.

  3. سخت افزار GPU به طور خاص در لیست بلوک قرار گرفته است. اگر «WebGPU از طریق فهرست مسدود یا خط فرمان غیرفعال شده است» را در chrome://gpu می‌بینید، می‌توانید با فعال کردن پرچم chrome://flags/#enable-unsafe-webgpu و راه‌اندازی مجدد Chrome، فهرست مسدودکننده‌های آداپتورهای WebGPU را غیرفعال کنید.

  4. هیچ آداپتور GPU منطبقی برای گزینه های ارسال شده در requestAdapter() وجود ندارد. سعی کنید requestAdapter() با گزینه های مختلف فراخوانی کنید .

  5. WebGPU به یک GPU (چه سخت افزاری و چه نرم افزاری شبیه سازی شده) نیاز دارد. با مراجعه به chrome://gpu می‌توانید بررسی کنید که آیا کروم یک GPU را تشخیص می‌دهد.

WebGPU کندتر از WebGL است

  1. chrome://gpu باز کنید و مطمئن شوید که می‌توانید «WebGPU: Hardware Accelerated» را بخوانید. اگر «WebGPU: فقط نرم افزار، شتاب سخت افزاری در دسترس نیست» را می خوانید، ممکن است لازم باشد درایورهای GPU خود را به روز کنید.

  2. ترجمه مستقیم مفاهیم WebGL به WebGPU ممکن است از بهینه سازی منحصر به فرد WebGPU استفاده کامل نداشته باشد. از WebGL به WebGPU را بررسی کنید تا در مورد برخی از تفاوت‌های آنها بیاموزید.

محدودیت های خاص ویندوز

هنگام استفاده از WebGPU در دستگاه های ویندوز، از محدودیت های زیر آگاه باشید:

  • Chrome از چند آداپتور GPU به طور همزمان پشتیبانی نمی کند. به شماره chromium:329211593 مراجعه کنید.

  • Chrome همیشه از همان آداپتور GPU استفاده می کند که برای بارهای کاری دیگر Chrome اختصاص داده شده است، که برای لپ تاپ ها به دلیل جنبه مصرف انرژی (یعنی صرفه جویی در انرژی) معمولاً کارت گرافیک یکپارچه است. این بدان معناست که گزینه powerPreference هیچ تاثیری هنگام فراخوانی requestAdapter() ندارد.