2016-10-29 1 views
2

Ich erstelle ein Mesh pro JSON-Objekt in einem Array mit 100 von ihnen gespeichert, also möchte ich 100 Meshes in die Szene hinzufügen, und ich habe Pläne, sogar hinzuzufügen dazu später.Zahlreiche Szenen mit zahlreichen Meshes aus 1 Array

Das belastet mein Projekt in puncto Leistung, wie Sie sich vorstellen können. Also versuche ich herauszufinden, wie man dieses Array in 10 überschaubaren Teilen schneidet und 10 dieser "Planet" Objekte pro Szene hinzufügen. Also würde es 10 Szenen mit jeder Szene mit 10 Meshes geben.

Ich habe keine Ahnung, ob das überhaupt machbar ist, da dies meine erste Arbeit an three.js ist. Wie gehe ich vor? Mein Code:

var scene1 = new THREE.Scene(); 
var scene2 = new THREE.Scene(); 
var scene3 = new THREE.Scene(); 
var scene4 = new THREE.Scene(); 
var scene5 = new THREE.Scene(); 
var scene6 = new THREE.Scene(); 
var scene7 = new THREE.Scene(); 
var scene8 = new THREE.Scene(); 
var scene9 = new THREE.Scene(); 
var scene10 = new THREE.Scene(); 

var data = [{ 
     "Planet": "1", 
    }, { 
     "Planet": "2", 
    }, { 
     "Planet": "3", 
    } 
    // this continues up until planet 100 
]; 

//this adds 100 meshes to the scene 
for (var i = 0; i < data.length; i++) { 

    var loader = new THREE.TextureLoader(); 
    var material = new THREE.MeshPhongMaterial({ map: loader.load('image.jpg') }); 
    var geometry = new THREE.SphereGeometry(30, 50, 50); 

    mesh = new THREE.Mesh(geometry, material); 

    //random x and z positions so they don't spawn on same spot 
    mesh.position.x = THREE.Math.randInt(-500, 500); 
    mesh.position.z = THREE.Math.randInt(-500, 500); 
    scene1.add(mesh); 
} 

Edit: Ich entschuldige mich für nicht klar genug zu sein, wie ich hätte sein sollen. Das Hauptziel ist die Funktionalität, 10 Szenen zu wechseln und 10 "Planeten" in jeder Szene basierend auf dem data Array zu sehen. Ich habe diesen Code geschrieben, damit es dem Benutzer überlassen bleibt, welche Szene gerendert werden soll und welche nicht. Das Rendern und Sehen von 100 Planeten in einer Szene ist nicht nur für die Performance schrecklich, es ist nicht das, wonach mein Projekt aussehen muss.

var userInput = 1; 
    if (userInput === 1) { 
     renderer.render(scene1, camera); 
    } else { 
     renderer.render(eval('scene' + userInput), camera); 
    } 
+1

Bitte beachten Sie, dass Sie in Ihrem Code derzeit nur Szene10 einrichten. scene1-scene9 sind momentan undefiniert. – msun

+0

Danke, ja das habe ich übersehen, als ich den Code für diese Frage entworfen habe. Ich habe meine ursprüngliche Frage mit dem Update aktualisiert, um Verwirrung für später zu vermeiden. – Zhyohzhy

Antwort

1

Ihre Frage zu beantworten, würden Sie wahrscheinlich durch Speichern der Szenen in einem Array starten:

// Setup scenes 
var scenes = []; 
for(var i=0;i<10;i++) { 
    scenes.push(new THREE.Scene()); 
} 

dann die Maschen zu einer Szene auf der Grundlage Ihrer Zähler zuweisen:

//this adds 100 meshes to the scene 
for (var i = 0; i < data.length; i++) { 
    ... 
    var sceneIndex = Math.floor(i/10); 
    var curScene = scenes[sceneIndex]; 
    curScene.add(mesh); 
} 

Aber ich bin mir nicht sicher, was Ihr Ziel hier in Bezug auf die Verbesserung der Leistung ist. Gibt es mehr Code als das, was Sie gezeigt haben? Wenn Sie weiterhin alle 10 Szenen gleichzeitig rendern möchten, ist dies nicht schneller als mit einer einzelnen Szene.

+0

Ich aktualisierte meine Frage mit mehr Informationen. Ich dachte mit dem Code, den ich in der Bearbeitung bereitgestellt habe, dass das das Renderproblem umgehen würde, aber das tut es überhaupt nicht. Die Ladezeit der Seite ist schrecklich, selbst wenn userInput = 1. scene1 hat nur 10 Planeten. Würde Ihr Code immer noch genauso aussehen, nachdem ich meine bearbeitete Frage geklärt habe? – Zhyohzhy

+0

Nachdem ich Ihre Änderung gesehen habe, würde der Code, den ich gepostet habe, nur eine Verbesserung der Codequalität gegenüber dem sein, was Sie haben. Keine Leistungssteigerung dort. In Bezug auf die Ladezeit der Seite versuchen Sie, den var loader/material/geometry außerhalb der Schleife zu verschieben, um zu sehen, ob das die Ladezeit verbessert. In diesem spezifischen Codebeispiel benötigen Sie nur 1 Instanz des Loaders und wahrscheinlich nur 1 Instanz der Textur, des Materials und der Geometrie (obwohl sich das je nachdem ändern kann, wo Sie das als Nächstes verwenden). – msun

+0

Leider verschieben Sie den Loader aus der loop versucht nicht, die Ladezeit zu erhöhen, aber im Moment mache ich mir Sorgen, dass der Code funktioniert, weil ich nicht sicher bin, wie ich ihn implementieren soll. Ich habe eine Geige gemacht -> https://jsfiddle.net/L6bu6b2f/ wo ich meinen Code für dich vereinfache. Könnten Sie mir zeigen, wie ich erreichen kann, was ich wollte, wie in der ursprünglichen Frage beschrieben? – Zhyohzhy

Verwandte Themen