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 זמינה רק להקשרים מאובטחים. אם אתם מציגים את הקוד דרך פרוטוקול לא מאובטח (לדוגמה, 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 ב-Chrome ללא ממשק משתמש.

  3. חומרת ה-GPU נוספה באופן ספציפי לרשימת החסימה. אם מופיעה ההודעה 'WebGPU הושבת באמצעות רשימת החסימות או שורת הפקודה' בקובץ chrome://gpu, אפשר להשבית את רשימת החסימות של מתאמי WebGPU על ידי הפעלת הדגל chrome://flags/#enable-unsafe-webgpu והפעלה מחדש של Chrome.

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

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

  6. תהליך ה-GPU קרס כמה פעמים. אפשר לטעון מחדש את הדף או להפעיל מחדש את Chrome. מידע נוסף זמין במאמר שיטות מומלצות למניעת אובדן של מכשיר WebGPU.

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

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

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

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

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

  • ב-Chrome אין תמיכה בשימוש בכמה מתאמי GPU בו-זמנית. בעיה chromium:329211593

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