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 נדרש Chrome 113 ואילך ב-ChromeOS, ב-macOS, ב-Windows וב-Chrome 121 ואילך ב-Android. יש לבדוק את הגרסה בכתובת chrome://version ולעדכן אותה במידת הצורך.

  2. לא ניתן לגשת כרגע ל-WebGPU מ-Service Worker או מ-worker משותף. אם אתם משתמשים ב-Service Worker או ב-Shared worker, צריך להעביר את קוד ה-WebGPU ל-worker ייעודי או להקשר של החלון הגלובלי.

  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 ריק

הדוגמה הבאה היא דוגמה לשגיאת JavaScript שעלולה להופיע כשהמתאם שמתקבל מהקריאה ל-requestAdapter() הוא null:

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. חומרת ה-GPU נוספה לרשימת חסימה ספציפית. אם מופיעה ההודעה "WebGPU הושבת דרך רשימת חסימה או באמצעות שורת הפקודה" ב-chrome://gpu, אפשר להשבית את רשימת החסימה של מתאמי WebGPU על ידי הפעלת הדגל chrome://flags/#enable-unsafe-webgpu והפעלה מחדש של Chrome.

  4. אין מתאם GPU תואם לאפשרויות שהועברו ב-requestAdapter(). אפשר לנסות להתקשר אל requestAdapter() עם אפשרויות אחרות.

  5. ל-WebGPU נדרש GPU (עם אמולציה של חומרה או תוכנה). אפשר לבדוק אם Chrome מזהה GPU בכתובת chrome://gpu.

WebGPU איטי יותר מ-WebGL

  1. פותחים את chrome://gpu ומוודאים שקוראים את הקטע 'WebGPU: האצת חומרה'. אם כתוב "WebGPU: תוכנה בלבד, שיפור מהירות באמצעות חומרה לא זמין", יכול להיות שצריך לעדכן את מנהלי ההתקנים של ה-GPU.

  2. תרגום ישיר של מושגי WebGL ל-WebGPU עלול לא לנצל את מלוא היתרונות של האופטימיזציות הייחודיות של WebGPU. בקטע מ-WebGL ל-WebGPU תוכלו ללמוד על כמה מההבדלים ביניהם.

מגבלות ספציפיות ל-Windows

שימו לב למגבלות הבאות בזמן השימוש ב-WebGPU במכשירי Windows:

  • Chrome לא תומך בשימוש במספר מתאמי GPU בו-זמנית. מידע נוסף על בעיה כרום:329211593.

  • Chrome משתמש תמיד באותו מתאם GPU שהוקצה לעומסי עבודה אחרים של Chrome. מחשבים ניידים הוא בדרך כלל הכרטיס הגרפי המשולב, בשל היבט צריכת החשמל (כלומר, חיסכון בחשמל). כלומר, לאפשרות powerPreference אין השפעה כשמתקשרים אל requestAdapter().