Speicherleck in Three.js

8

Wir versuchen, eine einzelne Seite App zu erstellen, in der Benutzer zwischen mehreren Three.js Apps wechseln können. Wir bemerken jedoch eine ständige Zunahme der Speichernutzung durch die Registerkarte. Es gibt keinen Speicherverlust in unserer App und es scheint, dass Three.js-Variablen nicht aus dem RAM gelöscht werden.

Schritte zum Wiederherstellen

  1. Rufen Sie Ссылка auf und öffnen Sie den Aufgaben-Manager in Google Chrome, um die Speichernutzung auf der betreffenden Registerkarte zu sehen.
  2. Wechseln Sie zwischen den Beispielen und Sie werden feststellen, dass die Speicherbelegung ständig zunimmt und es so aussieht, als ob GC niemals stattfindet oder den zuvor verbrauchten Speicherblock nicht entfernen kann.
  3. Für meinen Laptop mit der folgenden Konfiguration Ссылка kann der Speicher problemlos über 1 GB hinausgehen, wenn alles zu frieren beginnt.

Ich habe zwei Bugs bemerkt, die bei Chrom und Firefox wegen dieses Speicherproblems eingereicht wurden, aber es wurde noch keine Lösung bereitgestellt.

Bitte helfen Sie mir, wie man Speicher freigibt, die meisten Dinge, die ich im Internet gefunden habe, helfen nicht.

PS: Ich habe auch bei Three.js einen Fehler gemeldet Ссылка

    
Gaurav 08.01.2014, 13:53
quelle

1 Antwort

7

Hier ist was für mich der Trick

  1. Erstellen Sie ein Array, das alle der Szene hinzugefügten Elemente enthält.
  2. Wenn Sie der Szene ein zusätzliches Element hinzufügen, fügen Sie es zu diesem Array hinzu.
  3. Führen Sie bei der Funktion "destroy" den Befehl scene.remove ('Objektname') aus, um sie aus der Szene zu entfernen.
  4. Iterieren Sie jetzt durch das Array und machen Sie alle Elemente manuell undefiniert.

Auf diese Weise konnte ich mehr als 600 MB Speicher freigeben, nachdem ich auf eine andere Seite gewechselt hatte.

Aktualisieren Antwort von Herrn Doob und WestLangley Speicherverlust mit three.js und vielen Formen

In webGLRenderer, nach dem Entfernen eines Mesh mit

scene.remove( mesh ) ,

Sie können den Speicher mit

freigeben

renderer.deallocateObject( mesh );

Sie können Texturen mit

aufheben

renderer.deallocateTexture( texture );

    
Gaurav 12.02.2014, 10:46
quelle