2011-10-21 12 views
8

Tôi đã mở matrix multiplication benchmarks và trình duyệt của tôi (Firefox 7.0.1) bị đóng băng cho đến khi điểm chuẩn hoàn thành (tôi đã mở trang trong Asus EeePC 1000H cũ).Sử dụng WebGL từ bên trong một Web Worker: là nó có thể? Làm sao?

Tôi nghe nói rằng các nhân viên web được phát minh để tách riêng việc xử lý hiển thị các trang web. Có thể sử dụng API của Web Worker để làm cho WebGL không chặn toàn bộ trình duyệt web không?

+0

Trong tin tức khác, điểm chuẩn cũ (sử dụng phiên bản cũ của các thư viện ma trận khác nhau), sai và không hợp lệ (không bận tâm kiểm tra xem chức năng có được gọi là thực sự tính toán cùng một thứ). Đây là một tài khoản không bị hỏng http://stepheneb.github.com/webgl-matrix-benchmarks/matrix_benchmark.html – gman

+1

Chưa. Nhưng chỉ cần tìm kiếm WebGL trong WebWorker và bạn sẽ thấy rằng nó đang hoạt động. – abergmeier

Trả lời

22

Vì mục đích rõ ràng: điểm chuẩn mà bạn đã liên kết không sử dụng WebGL. (Tôi nên biết, tôi đã viết nó.) Và trong trường hợp của điểm chuẩn cụ thể đó, bạn hoàn toàn có thể chạy nó trong một Web Worker bây giờ và nó sẽ là hoàn toàn tốt đẹp.

(Thực tế thú vị - Web Workers không hỗ trợ TypedArrays khi chuẩn được xây dựng, và vì hầu hết các thư viện ma trận dựa vào đó là không thực tế khi chạy nó trong một Worker tại thời điểm đó.)

Dù sao, để trả lời câu hỏi ban đầu của bạn: Không, WebGL không thể chạy trong công nhân. Trình chặn cốt lõi cho điều này là để có được ngữ cảnh WebGL, bạn cần gọi getContext trên phần tử canvas. Công nhân Web không cho phép truy cập DOM một cách rõ ràng (đó là một điều tốt, BTW!) Và như vậy bạn sẽ không bao giờ có thể truy cập WebGL từ một nhân viên.

Nhưng điều đó không tệ như bạn nghĩ. Đối với một, xem xét rằng hầu hết tất cả các rendering 3D thực sự xảy ra trong một thread khác nhau anyway. Cụ thể, một loạt các chuỗi chạy trên GPU của bạn. Phần duy nhất mà trình duyệt có trong đó là nói với trình điều khiển đồ họa của bạn "Này! Bắt đầu vẽ một số hình tam giác sử dụng dữ liệu này!" và sau đó nó di chuyển mà không chờ đợi các hình tam giác thực sự được hiển thị. Như vậy, trong khi các lệnh vẽ phải được thực thi từ tiến trình chính, thời gian nó dành cho việc chặn quá trình đó là (thường) rất ít.

Tất nhiên, đó không phải là những gì sẽ ăn lên một loạt thời gian của bạn nếu bạn đang mã hóa một trò chơi thời gian thực. Bạn đã có hình ảnh động, vật lý, AI, phát hiện va chạm, đường dẫn ... có rất nhiều tác vụ phi đồ họa có liên quan sẽ ăn CPU của bạn còn sống nếu bạn để chúng. Trong một số trường hợp (hoạt hình), nó thường chỉ là gobs và gobs của ma trận toán học, giống như điểm chuẩn mà bạn liên kết đến! May mắn thay cho chúng ta, tuy nhiên, kiểu xử lý đó có thể được thực hiện trong một Worker, và tất cả những gì chúng ta cần để truyền lại cho luồng chính là dữ liệu cần thiết để render scene.

Có, điều này giới thiệu một số thách thức về đồng bộ hóa và truyền dữ liệu, nhưng trên toàn bộ nó sẽ được bao la thích hợp hơn để khóa trình duyệt của bạn trong khi chúng tôi thử và mô phỏng 500 hộp va chạm.

+0

Ồ .. Vì các kịch bản này được gọi là glMatrix và CanvasMatrix, tôi cho rằng họ đã tận dụng lợi thế của WebGL để nhân các ma trận ... –

2

Theo mặc định, bạn không thể sử dụng WebGL trong một Web Worker như Toji đã giải thích.

Bạn có thể xem WebGLWorker là thư viện cho phép bạn thực hiện các công cụ WebGL trong một Web Worker, bằng các lệnh proxy trong suốt tới chuỗi chính. Đây là một hình ảnh đẹp blog post giải thích cách hoạt động của nó.