Verwendung von WebGL in einem Web Worker: Ist das möglich? Wie?

9

Ich habe diese Matrixmultiplikations-Benchmarks geöffnet und meinen Browser (Firefox 7.0.1) eingefroren, bis die Benchmarks angezeigt werden fertig (Ich habe die Seite in einem alten Asus EeePC 1000H geöffnet).

Ich habe gehört, dass Web-Mitarbeiter erfunden wurden, um die Verarbeitung von der Anzeige der Webseiten zu trennen. Ist es möglich, die Web Workers-API zu verwenden, um WebGL nicht den gesamten Webbrowser blockieren zu lassen?

    
João Pinto Jerónimo 21.10.2011, 04:11
quelle

3 Antworten

2

Ja, bei Firefox!

Ссылка

  

Wir freuen uns, WebGL in Web Workers in Firefox 44 + ankündigen zu können! Mit der neuen OffscreenCanvas-API können Sie jetzt einen WebGL-Kontext außerhalb des Hauptthreads erstellen.

    
DWoldrich 23.06.2016, 18:57
quelle
22

Aus Gründen der Übersichtlichkeit: Der Benchmark, mit dem Sie verbunden sind, verwendet WebGL überhaupt nicht. (Ich sollte es wissen, ich habe es geschrieben.) Und im Fall dieses bestimmten Benchmarks könntest du es absolut in einem Web Worker laufen lassen und es wäre vollkommen in Ordnung.

(Fun fact - Web Workers unterstützten TypedArrays nicht, als der Benchmark erstellt wurde, und da die meisten Matrixbibliotheken darauf angewiesen sind, dass es zu diesem Zeitpunkt in einem Worker nicht praktikabel war. Das wurde seitdem behoben.)

Wie auch immer, um Ihre ursprüngliche Frage zu beantworten: Nein, WebGL kann nicht in einem Worker ausgeführt werden. Der Grund dafür ist, dass Sie, um einen WebGL-Kontext zu erhalten, getContext auf einem Canvas-Element aufrufen müssen. Web Workers verbieten explizit den DOM-Zugriff (was eine gute Sache ist, BTW!) Und als solcher werden Sie niemals in der Lage sein, von einem Arbeiter auf WebGL zuzugreifen.

Aber das ist nicht so schlimm, wie Sie vielleicht denken. Denken Sie zum Beispiel daran, dass das meiste 3D-Rendering tatsächlich in einem anderen Thread stattfindet. Genauer gesagt, eine ganze Reihe von Threads läuft auf Ihrer GPU. Der einzige Teil des Browsers ist es, Ihrem Grafiktreiber zu sagen: "Hey! Starten Sie das Rendern einiger Dreiecke mit diesen Daten!" und dann geht es weiter, ohne darauf zu warten, dass die Dreiecke tatsächlich gerendert werden. Während also die Zeichenbefehle vom Hauptprozess ausgeführt werden müssen, ist die Zeit, die er für die Blockierung dieses Prozesses benötigt, (normalerweise) sehr gering.

Das wird natürlich nicht viel Zeit kosten, wenn Sie ein Echtzeit-Spiel programmieren würden. Sie haben Animationen, Physik, KI, Kollisionserkennung, Wegfindung ... es gibt eine Menge nicht grafischer Aufgaben, die Ihre CPU am Leben halten, wenn Sie sie zulassen. In einigen Fällen (Animation) sind es in der Regel nur "gobs and gobs" von Matrix Mathe, genau wie der Benchmark, mit dem Sie verlinkt haben! Zum Glück für uns kann diese Art der Verarbeitung jedoch in einem Worker erfolgen, und alles, was wir zur Kommunikation mit dem Hauptthread benötigen, sind die Daten, die zum Rendern der Szene erforderlich sind.

Ja, das bringt einige Herausforderungen in Bezug auf Synchronisation und Datenübertragung mit sich, aber im Großen und Ganzen ist es viel vorzuziehen, Ihren Browser zu sperren, während wir versuchen, diese kollidierenden 500 Boxen zu simulieren.

    
Toji 21.10.2011 15:27
quelle
2

Standardmäßig können Sie WebGL nicht in einem Web Worker verwenden, wie Toji erklärt hat.

Sie können WebGLWorker auschecken. Dies ist eine Bibliothek, mit der Sie WebGL-Inhalte in einem Web Worker durch transparentes Proxying ausführen können Befehle an den Hauptthread. Hier ist ein schöner Blogpost erklärt, wie es funktioniert.

    
dcoz 24.09.2015 13:21
quelle

Tags und Links