Wie säubere und entferne ich einen WebGL-Canvas-Kontext nach der Verwendung von der GPU?

8

Wie bereinigen Sie ein WebGL-Kontextprogramm und entladen Sie das Programm, die Puffer und alles aus der GPU und dem dom-Element?

Ich möchte sichergehen, dass wir nicht verunreinigt sind.

Es wäre auch schön, wenn möglich, den Canvas wiederzuverwenden (und ich weiß nicht, ob es 2d oder webgl context wäre).

    
Bartvds 11.05.2014, 22:07
quelle

2 Antworten

13

Sie können einfach jeden Verweis auf Ihren gl-Kontext und alle gl-Objekte und die Zeichenfläche verlieren und die Zeichenfläche aus dem DOM entfernen. Leider, weil JavaScript Müll ist, gibt es keine Ahnung, wann der Browser tatsächlich den Speicher freigeben wird. Es gibt einige Konformitätstests, um zu testen, ob sie das richtig machen, aber wenn du nicht nur hoffen und beten willst, dann ....

Um alle Ihre Ressourcen freizugeben, rufen Sie gl.deleteXXX für alles auf, was Sie erstellt haben, und lösen Sie alle Bindepunkte. Das bedeutet, dass gl.bindTexture für alle Textureinheiten auf allen Zielen mit null aufgerufen wird, dasselbe gilt für Arrays, Framebuffer und Renderbuffer.

%Vor%

Da Sie NULL nicht an ein Attribut binden können, können Sie die Größe all Ihrer Puffer auf 1 setzen (Null ist nicht erlaubt), bevor Sie sie löschen. Entweder das oder erstelle einen neuen Puffer und weise ihn allen Attributen zu.

Beispiel für das erste

%Vor%

Oder erstellen Sie einen neuen Puffer und weisen Sie ihn allen Attributen zu

%Vor%

Dadurch werden die alten Puffer von den Attributen getrennt.

Stellen Sie abschließend die Leinwandgröße auf 1x1 Pixel ein.

%Vor%

Es ist keine perfekte Lösung, aber es wird sofort alle außer ein paar k Speicher sofort freigeben, ohne auf die Speicherbereinigung zu warten, die außerhalb Ihrer Kontrolle liegt.

Wenn Sie die Leinwand von Grund auf wiederverwenden, können Sie das nicht tun. Die Zeichenfläche hat immer den gleichen Kontext, in dem Sie sie zuerst angefordert haben.

Siehe auch @ Johans Antwort zu loseContext

    
gman 12.05.2014, 10:26
quelle
4

Um den Kontext zu verlieren, verwenden Sie die Erweiterung WEBGL_lose_context als

%Vor%

Siehe Ссылка

    
Johan van Breda 25.06.2016 10:32
quelle

Tags und Links