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 khiến WebGPU có thể không hoạt động hoặc không hoạt động như mong đợi trong trình duyệt Chrome, kèm theo các bước rõ ràng để giải quyết vấn đề 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ông tin đó theo thứ tự cụ thể sau:

  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. 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 vào các ngữ cảnh bảo mật. Nếu bạn 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 những cách sau:

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

    • Thêm nguồn gốc vào danh sách "Nguồn gốc không an toàn được coi là an toàn" của 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 chứng chỉ giả. Bạn vẫn sẽ nhận được cảnh báo trong Chrome. Bạn có thể bỏ qua cảnh báo này bằng cách nhấp vào "Nâng cao" rồi nhấp vào "Tiếp tục...".

    • Hiển thị máy chủ web cục bộ của bạn trên Internet bằng ngrok.

Bộ chuyển đổi GPU là giá trị 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 mà bạn nhận được từ lệnh gọi requestAdapter() là 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ông tin đó theo thứ tự cụ thể sau:

  1. WebGPU bị tắt khi người dùng đã tắt tuỳ chọn "Sử dụng tính năng tăng tốc đồ hoạ nếu có" trong chrome://settings/system. Kiểm tra xem chế độ cài đặt này có bị tắt hay không rồi 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 rồi 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 phần Hỗ trợ WebGPU trong Chrome không có giao diện người dùng để 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 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 nào phù hợp với các tuỳ chọn được truyền trong requestAdapter(). Thử gọi requestAdapter() bằng nhiều tuỳ chọn.

  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 GPU hay không bằng cách truy cập vào chrome://gpu.

  6. Quá trình GPU đã gặp sự cố nhiều lần. Bạn có thể tải lại trang hoặc khởi động lại Chrome. Hãy xem Các phương pháp hay nhất về việc mất thiết bị WebGPU để tìm hiểu thêm.

WebGPU chậm hơn WebGL

  1. Mở chrome://gpu và đảm bảo bạn có thể đọc "WebGPU: 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 trực tiếp dịch các khái niệm WebGL sang WebGPU có thể không tận dụng được hết các tính năng tối ưu hoá riêng của WebGPU. Hãy xem bài viết Từ WebGL đến WebGPU để tìm hiểu một số điểm khác biệt giữa hai công nghệ này.

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 thiết bị Windows:

  • Chrome không hỗ trợ việc sử dụng nhiều bộ chuyển đổi GPU cùng lúc. Xem vấn đề chromium:329211593.

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