Wir beschäftigen uns mit großen Three.js Szenen mit vielen einzelnen Objekten. Es ist leicht, mit Szenen zu enden, die 25k bis 50k Object3D
Instanzen haben. Ja, das ist viel, aber wir sehen derzeit keinen einfachen Weg, diese Zahl zu senken. Das Löschen einer solchen Szene durch Entfernen aller Objekte dauert normalerweise etwa zwei Minuten. Dies ist der Fall, wenn Sie jedes Element einzeln mit scene.remove(element);
entfernen und alle Elemente zuerst sammeln und scene.remove(element1, element2, ...);
aufrufen. Wir haben auch versucht, die komplette Szeneninstanz zu ersetzen, aber ohne Erfolg: Es war immer noch langsam.Entfernen vieler Objekte aus Three.js Szene langsam
Wir haben einige Unterschiede zwischen verschiedenen Grafikkarten gesehen und vermuten, dass dies mit der Verwendung vieler Puffergeometrien zu tun hat, die vermutlich von der Grafikkarte entfernt werden müssten (was dann die Leistung beeinflussen würde).
Da der Browser während der Entfernung des Objekts blockiert, wird die Website für diesen Zeitraum unbrauchbar. Sehen Sie eine Möglichkeit, die Leistung der Objektentfernung zu verbessern oder nicht blockierend zu machen (ohne setTimeout()
zum Entfernen einzelner Elemente)?
Dies zeigt das Problem in einer vereinfachten Art und Weise (mit 50k Würfel, nach dem ersten Rahmen entfernt, aber einige unserer Objekte sind viel komplexer): http://jsfiddle.net/ua2mg5ty/
Huch. Vielleicht sollten Sie 'InstancedBufferGeometry' verwenden. Siehe zum Beispiel [this] (http://threejs.org/examples/webgl_buffergeometry_instancing.html) und [this] (http://threejs.org/examples/webgl_buffergeometry_instancing_dynamic.html). – WestLangley
Danke für den Zeiger! Wenn ich mich nicht irre, impliziert die Verwendung von 'InstanceBufferGeometry', dass die einzelnen Objektinstanzen ähnlich sind. Wir zeigen viele große Neuronen, die alle sehr unterschiedlich sind. Sie basieren derzeit auf 'LineSegments' mit regulären 'Geometry'-Instanzen. Ich nehme an, ich könnte 'InstanceBufferGeometry' verwenden, um nur ein einzelnes Liniensegment zu speichern und ein Offset-Array zu verwenden, um einzelne Liniensegmente an der richtigen Position zu instanzieren. Macht das Sinn? – tomka
Vielleicht. Oder verwende 'BufferGeometry'. Vermeiden Sie regelmäßige Geometrie. Achten Sie darauf, 'dispose()' beim Entfernen von Objekten aufzurufen. – WestLangley