2016-07-12 6 views
0

Mithilfe von rgl in knitr können Benutzer Dokumente mit mehreren WebGL-Szenen in separaten Anzeigen erstellen. Jedes dieser Elemente wird erstellt, indem eine Arbeitsfläche erstellt wird, ein WebGL-Kontext zugeordnet wird und anschließend eine Reihe von WebGL-Plots ausgeführt werden.Wie bekomme ich einen Kontext wiederhergestellt?

Benutzer können für eine beliebige Anzahl von Anzeigen in einer einzigen HTML-Seite, fragen und schließlich werden sie aus Kontexten laufen, und (in Firefox) wird die Konsole

Exceeded 16 live WebGL contexts for this principal 

zeigen und ich werde das WebGLcontextlost-Ereignis. Wenn Sie auf der Seite blättern, sind alle früheren Anzeigen leer, nur die späteren werden angezeigt.

Wie bitte ich um die Wiederherstellung derjenigen, die gerade im Fenster angezeigt werden?

Bearbeitet hinzuzufügen: Eine Variante zu dieser Frage: Wie setze ich eine Leinwand, um nur zu versuchen, sich selbst zu zeichnen, wenn es in Sicht gescrollt hat? Im typischen Fall sind nur ein oder zwei Kontexte gleichzeitig sichtbar, daher sollte es in Ordnung sein, beide zu zeichnen. Aber der Code muss gesagt werden, wenn das passiert.

+0

Einige andere mögliche Lösungen. [Verwenden Sie eine Leinwand und rendern Sie nur Ansichtsfenster] (http://stackoverflow.com/questions/30541121/multiple-webgl-models-on-the-same-page). [Verwendung von 1 WebGL-Canvas und mehreren Nicht-Webgl-Canvases] (http://stackoverflow.com/questions/15824840/display-different-scenes-sharing-resources-on-multiple-canvases). Nur wenn ein Kontext angezeigt wird, siehe. Wie nur für das Rendern auf dem Bildschirm sehen Sie https://github.com/greggman/requestanimationframe-fix.js – gman

Antwort

0

Ich weiß nicht, wie das WebGLcontextrestored Ereignis auslösen, aber ich kann die Variante auf meine Frage beantworten:

Diese Webseite: http://developer.telerik.com/featured/lazy-loading-images-on-the-web/ beschreibt, wie „lazy loading“ von Bildern zu tun, dh nur sie zu laden wenn sie angezeigt werden. Die gleiche Art von Ansatz funktioniert für verzögertes Laden von WebGL Szenen, mit den folgenden Unterschieden:

  • Da der Zusammenhang jederzeit verloren gehen kann, müssen Sie nicht die Hörer entfernen möchten, wenn Sie es geladen haben Einmal.

  • Sie möchten, dass das Ereignis WebGLcontextlost die Tatsache aufzeichnet, dass die Zeichenfläche mit einem neuen Kontext neu initialisiert werden muss.

  • Sie müssen die Szene zeichnen, nachdem Sie sie neu initialisiert haben.

  • (Optional): Ich mag die Illusion, dass die Szene immer da war, also prüft mein isInBrowserViewport Test, ob ein Teil der Szene sichtbar ist, anstatt die ganze Szene sichtbar zu machen.

Bearbeitet hinzufügen: Der obige Ansatz ist nicht ausreichend für Firefox. Sobald Sie einen WebGL-Kontext für einen Canvas-Bereich erhalten, scheint es für immer dort zu bleiben. Wenn der Kontext verloren geht, weil Sie zu viele andere zugewiesen haben, kommt er nie zurück. Die einzige Möglichkeit, diese Canvas erneut zu verwenden, besteht darin, sie zu löschen und neu zu erstellen und dann einen neuen Kontext zuzuweisen. Ich habe in Chrome nicht so viel experimentiert, aber es scheint die gleiche Einschränkung zu haben.

Verwandte Themen