2017-01-01 6 views
1

Ich arbeite an einem three.js-Projekt, das es dem Benutzer ermöglicht, durch Szenen zu wechseln, die verschiedene Mesh-Objekte enthalten. Sie werden alle gleichzeitig in das Projekt geladen, wenn die Seite geladen ist, und all diese Objekte haben Texturen, die die Leistung stark belasten.Objekte löschen und wiederherstellen

Also dieses Problem zu beheben, ich will vorübergehend alle Objekte in alle Szenen entfernen, die der Benutzer nicht ausgewählt hat. Bei 10 Szenen sollte der Benutzer beispielsweise auswählen, was sich in Szene 4 befindet (das wäre die currentScene), dann sollten die Szenen 1 bis 3 und 5 bis 10 keine Objekte aufweisen, die die Leistung unnötig belasten. Dies sollte auch beim Laden der Seite berücksichtigt werden. Nur wenn der Benutzer erneut eine dieser zuvor erwähnten Szenen auswählt, stellt er die Objekte der Szene wieder her.

Diese FIDDLE ist ein Beispiel für mein Projekt, das den wesentlichen Code umfasst. Ich verwende die remove() und dispose() Methoden, um es zu erreichen.

//scene that's to be removed and disposed of 
var destroyScenes = scenes[1]; 

//removes and disposes all objects in above scene 

for (i = destroyScenes.children.length - 1; i >= 0; i--) { 
      obj = destroyScenes.children[i]; 
      destroyScenes.remove(obj); 
      obj.geometry.dispose(); 
      obj.material.dispose(); 
      obj.texture. 
    } 

Meine konkrete Frage (n), ist dies: Wie stelle ich die Objekte, wenn ich von ihnen zu entfernen und entsorgen? Ist das ein guter Ansatz, ist es überhaupt möglich und/oder gibt es einen besseren Weg, dies zu erreichen?

Auch, wenn dies eine Möglichkeit ist, wie wähle ich alle Szenen mit Ausnahme der currentScene?

PS: Ich bin mir bewusst, dass es eine Ladezeit zwischen den Szenen wechseln wird, aber ich würde noch viel mehr bevorzugen.

Antwort

0

Wie stelle ich die Objekte wieder her, wenn ich sie entferne und verwerfe? - Wenn Sie Objekt richtig entsorgen, müssen Sie es erneut laden, die

ist hässlich ist, dass ein guter Ansatz, um es, ist es sogar möglich, und/oder gibt es einen besseren Weg, dies zu erreichen? - Wenn Sie planen, das Objekt erneut anzuzeigen, ist es besser, obj.visible = false; Laden und Entsorgen ist die schlechteste Methode. Einige Dinge (wie Nebel usw.) können nicht korrekt angewendet werden, nachdem das Objekt später geladen wurde.

Auch, wenn dies eine Möglichkeit ist, wie wähle ich alle Szenen mit Ausnahme der currentScene? - Nicht sicher über Frage, eine neue Frage dafür stellen. (durch Steuern der Mausbewegung denke ich)

Ich bin mir bewusst, dass es eine Ladezeit zwischen den Szenen wechseln wird, aber ich würde immer noch viel lieber das. - Es ist kein Weg, wie es funktioniert. Szenen laufen gleichzeitig, Sie können den Animationsrahmen für inaktive Szenen anhalten. Die Szenen werden jedoch initialisiert, nicht während des Umschaltens.

Frage immer nur eine Frage pls.

+0

Würde also 'obj.visible = false' die Leistung verbessern? Noch mehr in Kombination mit 'cancelAnimationFrame'? Würdest du sagen, dass das die beste Herangehensweise ist? Danke – Zhyohzhy

+0

Wenn Sie Animation von unbenutzten Szenen stomieren und Verstecken ersetzen, Objekte zeigen, anstatt sie zu laden und zu zerstören, ja, es ist besser und es ist eine Best Practice – Martin

+0

Großartig.Ich habe so programmiert, dass alle Szenen außer "currentScene" auf "visible = false" gesetzt werden. "Würdest du wissen, wie du mir mit dem cancelAnimationFrame helfen kannst? Es scheint, dass man etwas schwieriger zu implementieren ist. https://jsfiddle.net/rm8tLpy5/1/ – Zhyohzhy

Verwandte Themen