WebGPU: Mẹo khắc phục sự cố và bản sửa lỗi

François Beaufort
François Beaufort

Tài liệu này giải thích lý do WebGPU có thể không hoạt động hoặc không hoạt động như mong đợi trong trình duyệt Chrome, cùng với các bước rõ ràng để giải quyết sự cố nếu có thể.

Ví dụ sau đây cho thấy lỗi JavaScript mà bạn có thể gặp phải khi gpu không có trong navigator:

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

Điều này có thể là do một trong những lý do sau. Hãy xem các thành phần theo thứ tự cụ thể này:

  1. WebGPU yêu cầu Chrome 113 trở lên trên ChromeOS, macOS, Windows và Chrome 121 trở lên trên Android. Hãy kiểm tra phiên bản của bạn tại chrome://version và cập nhật nếu cần.

  2. WebGPU chỉ có thể truy cập được trong các ngữ cảnh an toàn. Nếu phân phát mã qua một giao thức không an toàn (ví dụ: http:, file:), hãy sử dụng giao thức https: bảo mật hoặc giải quyết vấn đề này trong quá trình phát triển ứng dụng web theo một trong các cách sau:

    • Phân phát mã của bạn cục bộ trên http://localhost hoặc http://127.0.0.1 bằng một trong những lệnh sau: npx http-server hoặc python3 -m http.server.

    • Thêm nguồn gốc vào phần "Các nguồn gốc không an toàn được coi là an toàn" danh sách chrome://flags/#unsafely-treat-insecure-origin-as-secure rồi khởi động lại Chrome.

    • Cài đặt Node.js và chạy npx servez --ssl để phân phát thư mục của bạn qua https bằng một chứng chỉ giả mạo. Bạn vẫn sẽ nhận được cảnh báo trong Chrome, bạn có thể bỏ qua bằng cách nhấp vào "Nâng cao" sau đó, "Tiếp tục...".

    • Hiển thị máy chủ web cục bộ với Internet bằng ngrok.

Bộ điều hợp GPU rỗng

Sau đây là ví dụ về lỗi JavaScript mà bạn có thể gặp phải khi bộ chuyển đổi bạn nhận được từ lệnh gọi requestAdapter() có giá trị rỗng:

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

Điều này xảy ra vì một trong những lý do sau. Hãy xem các thành phần theo thứ tự cụ thể này:

  1. WebGPU bị tắt khi người dùng đã tắt chế độ "Sử dụng tính năng tăng tốc đồ hoạ khi khả dụng" trong chrome://settings/system. Kiểm tra xem chế độ cài đặt này đã tắt hay chưa và bật lại

  2. WebGPU chưa được hỗ trợ trên nền tảng này. Bạn có thể bật cờ chrome://flags/#enable-unsafe-webgpu và khởi động lại Chrome. Để hỗ trợ thử nghiệm Linux, bạn cũng cần bật cờ chrome://flags/#enable-vulkan. Hãy xem bài viết Hỗ trợ WebGPU trong Headless Chrome để tìm hiểu thêm.

  3. Phần cứng GPU đã được đưa vào danh sách chặn cụ thể. Nếu bạn thấy thông báo "WebGPU đã bị tắt thông qua danh sách chặn hoặc dòng lệnh" trong chrome://gpu, bạn có thể tắt danh sách chặn bộ chuyển đổi WebGPU bằng cách bật cờ chrome://flags/#enable-unsafe-webgpu và khởi động lại Chrome.

  4. Không có bộ chuyển đổi GPU phù hợp cho các tuỳ chọn được truyền vào requestAdapter(). Hãy thử gọi requestAdapter() bằng các tuỳ chọn khác.

  5. WebGPU yêu cầu GPU (phần cứng hoặc phần mềm được mô phỏng). Bạn có thể kiểm tra xem Chrome có phát hiện thấy GPU hay không bằng cách truy cập chrome://gpu.

WebGPU chậm hơn WebGL

  1. Mở chrome://gpu và đảm bảo bạn có thể đọc được "WebGPU: Hardware Accelerated" (Tăng tốc phần cứng). Nếu bạn thấy thông báo "WebGPU: Chỉ phần mềm, không có tính năng tăng tốc phần cứng", thì có thể bạn cần phải cập nhật trình điều khiển GPU.

  2. Việc dịch trực tiếp các khái niệm WebGL sang WebGPU có thể không tận dụng được hết khả năng tối ưu hoá độc đáo của WebGPU. Hãy xem Từ WebGL đến WebGPU để tìm hiểu về một số điểm khác biệt của chúng.

Các hạn chế dành riêng cho Windows

Hãy lưu ý các hạn chế sau khi sử dụng WebGPU trên các thiết bị Windows:

  • Chrome không hỗ trợ sử dụng đồng thời nhiều bộ điều hợp GPU. Hãy xem phần vấn đề về chromium:329211593.

  • Chrome luôn sử dụng cùng một bộ chuyển đổi GPU đã được phân bổ cho các tải công việc khác của Chrome (thường là đối với máy tính xách tay) là thẻ đồ hoạ tích hợp do khía cạnh sử dụng điện năng (chẳng hạn như: tiết kiệm điện năng). Điều này có nghĩa là tuỳ chọn powerPreference không có bất kỳ ảnh hưởng nào khi gọi requestAdapter().