2011-10-21 16 views
8

Otworzyłem ten matrix multiplication benchmarks i moja przeglądarka (Firefox 7.0.1) zamarła do czasu zakończenia testów (otworzyłem stronę w starym Asus EeePC 1000H).Używanie WebGL z poziomu Web Worker: czy to możliwe? W jaki sposób?

Słyszałem, że pracownicy sieci zostali wymyśleni w celu oddzielenia przetwarzania od wyświetlania stron internetowych. Czy możliwe jest korzystanie z interfejsu Web Workers API, aby WebGL nie utknął w całej przeglądarce?

+0

W innych nowościach, że test porównawczy jest stary (używa starych wersji różnych bibliotek macierzy), błędny i nieważny (nie zadał sobie trudu sprawdzenia, czy wywoływane funkcje faktycznie obliczają te same rzeczy). Oto jeden, który nie jest uszkodzony http://stepheneb.github.com/webgl-matrix-benchmarks/matrix_benchmark.html – gman

+1

Jeszcze nie. Ale po prostu wyszukuj WebGL w WebWorker, a przekonasz się, że to działa. – abergmeier

Odpowiedz

22

Dla większej przejrzystości: benchmark, z którym się łączysz, w ogóle nie korzysta z WebGL. (Powinienem wiedzieć, napisałem to.) A w przypadku tego konkretnego testu porównawczego absolutnie mógłbyś go uruchomić w Web Worker teraz i byłoby idealnie.

(Co ciekawe - pracownicy sieci Web nie obsługiwali aplikacji TypedArrays podczas konstruowania testu porównawczego, a ponieważ większość bibliotek macierzy polega na tym, że w danym czasie uruchamianie jej w Robotniku było niepraktyczne, zostało to naprawione.)

W każdym razie, aby odpowiedzieć na twoje pierwotne pytanie: Nie, WebGL nie może działać w pracownikach. Rdzeniem tego jest to, że aby uzyskać kontekst WebGL, należy wywołać getContext na elemencie canvas. Pracownicy Sieci wyraźnie nie zezwalają na dostęp do DOM (co jest dobrą rzeczą, BTW!) I jako taki nigdy nie będziesz mieć dostępu do WebGL od pracownika.

Ale to nie jest tak źle, jak mogłoby się wydawać. Po pierwsze, należy wziąć pod uwagę, że większość renderowania 3D w rzeczywistości dzieje się w innym wątku. W szczególności cała masa wątków uruchomionych na twoim GPU. Jedyną częścią, którą przeglądarka ma w swojej przeglądarce, jest poinformowanie sterownika graficznego "Hey! Start renderowanie niektórych trójkątów przy użyciu tych danych!" a następnie porusza się, nie czekając na renderowanie trójkątów. W związku z tym, podczas gdy komendy rysowania muszą być wykonywane z głównego procesu, czas, w jakim blokuje ten proces (zazwyczaj) jest bardzo mały.

Oczywiście, to nie jest to, co zje dużo czasu, jeśli kodowałeś grę w czasie rzeczywistym. Masz animacje, fizykę, sztuczną inteligencję, wykrywanie kolizji, odnajdywanie ścieżek ... istnieje wiele zadań nie związanych z grafiką, które pochłoną twój procesor, jeśli im na to pozwolisz. W niektórych przypadkach (animacja) zwykle są to tylko porcje matematyczne i matematyczne, podobnie jak w przypadku testu porównawczego, z którym się łączysz! Na szczęście dla nas ten typ przetwarzania może zostać wykonany w module Robotnik, a wszystko, co musimy przekazać do głównego wątku, to dane wymagane do renderowania sceny.

Tak, to wprowadza pewne wyzwania związane z synchronizacją i transferem danych, ale ogólnie rzecz biorąc, zdecydowanie lepiej będzie zamknąć przeglądarkę, gdy próbujemy symulować zderzenia tych 500 skrzynek.

+0

Oh .. Skoro te skrypty nazywają się glMatrix i CanvasMatrix, zakładałem, że wykorzystały WebGL do zwielokrotnienia macierzy ... –

2

Domyślnie nie można używać WebGL w Web Worker, jak wyjaśnił Toji.

Możesz wyewidencjonować WebGLWorker, która jest biblioteką, która pozwala robić rzeczy WebGL w Web Worker, przez przezroczyste proxy do głównego wątku. Oto ładny blog post, który wyjaśnia, jak to działa.

Powiązane problemy