SceneKit unter OS X mit Tausenden von Objekten

8

Ich folge diesem Tutorial: Ссылка

Ich bin an der Verwendung des Szenenkits interessiert, aber meine Szenen könnten möglicherweise Tausende von Kugeln enthalten. Um Scene Kit zu testen, habe ich Folgendes versucht:

%Vor%

Das funktioniert gut für, sagen wir, 1000 Kugeln (10 ^ 3), scheitert aber (vielleicht nicht überraschend) an 1.000.000 Kugeln (100 ^ 3). Es macht mir nichts aus, wenn ich keine Millionen Sphären benutzen kann, aber ich würde gerne herausfinden, was die vernünftige obere Grenze ist (5.000? 15.000?) Und wie man sie erhöht.

Was kann ich tun, um dies zu mildern? z.B. Ich habe spheron.segmentCount = 3 ausprobiert, und während das das Rendern beschleunigt, hat es keinen großen Einfluss auf die Speichernutzung, was vermutlich der limitierende Faktor ist.

Außerdem scheint es keine SCNPoint-Klasse zu geben. Ich habe darüber nachgedacht, nur einen Punkt anzuzeigen, wenn die Anzahl der Kugeln zu hoch ist, aber ich kann in der SceneKit-Dokumentation nicht sehen, wie ein einfacher Punkt angezeigt wird - das Einfachste, was ich sehen kann, ist ein Dreieck.

Jede Hilfe wird sehr geschätzt.

Bearbeiten: @toyos schlug vor, dass die SCNSphere-Objekte in ein einzelnes SCNGeometry-Objekt zusammengeführt werden (vorausgesetzt, sie müssen nicht unabhängig animiert werden, was nicht der Fall ist), kann aber nicht gefunden werden eine einfache Möglichkeit, dies zu tun.

SCNGeometry wird erstellt, indem [SCNGeometry geometryWithSources:(* NSArray)sources geometryWithElements:(* NSArray) elements] wie dokumentiert hier , aber ich bin mir nicht sicher, wie ich ein SCNGeometry -Objekt aus meinen Sphären erstellen kann.

z.B. Für eine einzelne Sphäre konnte ich sphere.geometryElementCount verwenden, um die Anzahl der Elemente zu erhalten und dann ein Array mit [sphere geometryElementAtIndex:(NSInteger)elementIndex] zu füllen, was mir die Elemente geben würde, aber ich bin mir nicht sicher, wie ich die "Quellen" bekommen soll (oder was sie überhaupt sind). Die Methode zum Abrufen der Geometriequellen ist [sphere geometrySourcesForSemantic:(NSString*) semantic] , aber was ist diese semantische Zeichenfolge? (Ist es gemeint, "Normale" oder "Vertices" zu sein oder ist das etwas anderes? Die Dokumentation sagt ziemlich hilfreich, dass die Semantik "Der semantische Wert der Geometriequelle" ist, ohne zu sagen, welche möglichen Werte der Semantik sind)

Das ist nur für eine einzelne Sphäre, was ziemlich sinnlos wäre (da SCNSphere sowieso nur eine Unterklasse von SCNGeometry ist), also muss ich jetzt mehrere Sphären hinzufügen. Muss ich also die Eckpunkte der Kugel manuell übersetzen, wenn ich sie meinem SCNGeometry -Objekt hinzufüge?

Ich versuche nur, den sinnvollsten Weg herauszufinden.

    
Matthew 05.02.2013, 22:44
quelle

2 Antworten

8

Die semantischen Strings sind SCNGeometrySourceSemanticVertex | Normal | Texcoord ...

Für mehrere Kugeln lautet die Antwort ja, Sie müssen die Ecke / Normalen mit der aktuellen Knotentransformation vor dem Abflachen transformieren.

Es folgt ein vereinfachtes Beispiel (d. h. es unterstützt nur das Zusammenführen der untergeordneten Elemente von "input", wenn sie alle die gleiche Geometrie haben)

%Vor%     
toyos 14.02.2013, 14:26
quelle
2

Wie Sie das am besten tun, hängt davon ab, was genau Sie erreichen möchten.

Sind diese Tausende von Punkten (ein Sternenfeldhintergrund für eine Weltraumszene vielleicht) statisch, oder müssen sie sich in Bezug aufeinander bewegen? Müssen sie eigentlich Kugeln sein? Wie viel Detail benötigen sie?

Wenn sie sich nicht unabhängig voneinander bewegen müssen, ist es eine gute Idee, sie zu einer einzigen Geometrie zusammenzuführen. Auf Mavericks (OS X 10.9) müssen Sie sich selbst nicht mit Geometriedaten anlegen - erstellen Sie für jeden Knoten einen Knoten und ordnen Sie alle Knoten einem einzigen Knoten zu (nicht dem Wurzelknoten Ihrer Szene) und rufen Sie flattenedClone auf. um eine Kopie dieses Knotens zu erhalten, dessen Geometrien kombiniert sind.

Wenn sie nicht sehr detailliert sein müssen, gibt es einige Möglichkeiten, die Leistung zu verbessern.

Einer davon ist, die segmentCount der Kugelgeometrie zu reduzieren - Sie brauchen keine 5000 Dreiecke, um eine Kugel zu zeichnen, die beim Rendern nur ein paar Pixel breit ist, was mit dem Standardsegment zu tun hat Anzahl von 48. (Wenn Sie mit den Geometriedaten herumspielen oder Knoten sofort abflachen, nachdem Sie die Segmentanzahl reduziert haben, müssen Sie [SCNTransaction flush] aufrufen, um sicherzustellen, dass sie aktualisiert wird.)

Eine weitere Möglichkeit besteht darin, die Dreieckszählung weiter zu reduzieren. Sind die Sterne (oder was auch immer) klein genug, dass sie sogar Kugeln sein müssen? Wenn Ihre Szene so eingerichtet werden kann, dass sie immer auf die Kamera ausgerichtet ist, könnte SCNPlane besser sein - mit ihrer minimalen Segmentanzahl sind es nur zwei Dreiecke.

Müssen sie sogar Dreiecke sein? Scene Kit kann Punkte wiedergeben - es gibt keine Unterklasse SCNGeometry für sie, da es im Allgemeinen nicht sinnvoll ist, einzelne Punkte unabhängig voneinander zu positionieren und zu transformieren. Sie können jedoch eine benutzerdefinierte Geometrie mit einem Array von Scheitelpunktpositionen und dem Geometrieelementtyp SCNGeometryPrimitiveTypePoint erstellen. Wenn Sie das Rendern einzelner Punkte anpassen möchten, können Sie der Geometrie Shader (oder Shader-Modifikatoren) hinzufügen.

    
rickster 05.03.2014 19:30
quelle