2016-05-06 15 views
6

Ich entwickle eine WebGL-Anwendung für Web und Mobile. Ich verwende häufig Hard-Refreshs, um die Ergebnisse meiner WebGL-Implementierung zu testen. Nach Ansicht versucht, erhalte ich die Fehlermeldung:Wie kann man einen WebGL-Kontext freigeben und nicht mehr speichern?

Error: WebGL: Exceeded 16 live WebGL contexts for this principal, losing the least recently used one. 

Dies auf einem frischen gestartet Browser nicht erscheint, aber nach dem Standort mehrmals zu aktualisieren. Ich denke, dass die WebGL-Kontexte nicht beendet, freigegeben, zerstört, aufgeräumt und korrekt freigegeben wurden.

Wie kann ich das tun?

Khronos Group erstellt eine Testsuite für die Freigabe und Müll WebGL-Kontext zu sammeln hier: https://www.khronos.org/registry/webgl/sdk/tests/conformance/context/context-creation-and-destruction.html (Hinweis: Dies könnte Ihr Browser abstürzen!)

Der Test läuft durch mit PASS und TEST COMPLETE, so basicly der Test nicht erkennt irgendwelche Probleme. Um jedoch die JavaScript-Konsole öffnen, liest es 33 Fälle von:

Error: WebGL: Exceeded 16 live WebGL contexts for this principal, losing the least recently used one. 

Ist das ein Fehler in wie WebGL vom Browser behandelt wird? Oder mache ich etwas falsch? Ich habe nie darüber nachgedacht, irgendwelche WebGL-Kontexte freizugeben.

Ich benutze Firefox Developer Edition 48.0a2 und Firefox 46.0.1.

Wie zu befreien und Müll sammeln Sie einen WebGL-Kontext?

Antwort

2

Ich denke, vielleicht falsch verstehe ich Ihre Frage

Sie sagen, Sie hart Auffrischungen tun. Solltest du im Browser auf Aktualisieren drücken? In diesem Fall würde ich zuerst alle Erweiterungen deaktivieren und sehen, ob das Problem weiterhin besteht. Wenn es ich

sonst einen Fehler mit mozilla-Datei würde, wenn Sie freie Leinwände versuchen und schaffen diejenigen kannte und der Hoffnung für die Garbage Collection gut .. hier ist die Antwort, die ich schrieb, bevor ich wieder lesen Ihre Frage


Die kurze Antwort ist, dass Sie keine Garbage Collection erzwingen können. Du solltest besser die gleichen Leinwände verwenden.

Es gibt eine Lösung, die hier alle Daten zu befreien und Zurücksetzen der Leinwand

How do I clean up and unload a WebGL canvas context from GPU after use?

In Ihrem speziellen Fall allerdings sind Sie zu 100% sicher, dass Sie nicht zu einem gewissen Hinweis auf die WebGL-Kontext festhalten oder Segeltuch? Zum Beispiel, wenn Sie dies tun

canvas.addEventListener('click', function(..) {}); 

Sie haben gerade eine Leinwand, die nie Müll gesammelt werden kann gemacht. Es ist eine Ereignis-Listener-Funktion angehängt. Sie haben keine Möglichkeit, diese Funktion zu entfernen, da Sie keinen Verweis darauf gespeichert haben. Sie müssen alle Listener als nur ein Beispiel für viele Arten, auf die Sie Referenzen verlieren, entfernen.

There's tons of ways to accidentally keep references to HTML elements like the canvas as well as WebGL objects. Behalten Sie mehr als null Referenzen und es wird niemals Müll gesammelt.

Here's some hints on finding the leaks

Auf der anderen Seite, wenn es mir wäre, würde ich versuchen, die Leinwände wieder zu verwenden.Um sicherzustellen, dass ich alles freigegeben habe, kann ich meine eigenen Erstellungs-/Löschfunktionen nennen, die alle Ressourcen verfolgen. Beispiel

var textures = []; 
function createTexture(gl) { 
    var tex = gl.createTexture(); 
    textures.push(txt); 
} 

function deleteTexture(gl, tex) { 
    gl.deleteTexture(tex); 
    textures.splice(textures.indexOf(tex), 1); 
} 

Jetzt, da ich alle Texturen bin Tracking ich alle übrigen leicht löschen können

while (textures.length) { 
    gl.deleteTexture(textures.pop()); 
}