Also verwende ich SceneKit, um eine Sammlung parametrischer Flächen zu rendern (deren Summe ein Objekt ergibt). Um diese auf den Bildschirm zu bringen, erstelle ich benutzerdefinierte Geometrien, indem ich die Punkte bemusse und Dreiecke erzeuge. Hier ist ein kurzer Überblick darüber, wie ich es mache.
%Vor%Und das scheint zu funktionieren. Nachdem ich alle diese Daten erhalten habe, mache ich es in die richtigen Strukturen (SCNGeometrySource und SCNGeometryElement) und mache eine SCNGeometry wie folgt
%Vor%Dies funktioniert und zeigt meine Oberflächen auf dem Bildschirm als ein einzelnes Geometrieelement an. Mein Problem ist, dass ich einige wirklich komplizierte Objekte habe, mit denen ich versuche zu arbeiten, und es ist nur sehr langsam, um die Kamera herum zu bewegen, wenn ich das Objekt betrachte. Das Rendern dauert ungefähr 500 ms. Das macht meine Bildrate und Erfahrung schrecklich.
Die Frage ist also, welche Schritte ich unternehmen kann, um die Leistung von SceneKit zu beschleunigen? Ich habe das gleiche Projekt mit WebGL mit Three.js mit der gleichen Menge an Daten gemacht und konnte eine Orbit-Kamera benutzen, also kann ich nicht glauben, dass das Szenecit nicht damit konkurrieren könnte. Welche Funktionen kann ich optimieren und ausschalten, um die Leistung zu erhöhen? Ich verwende den primitiven Dreiecks-Typ, die allowsCameraControl = true für die umkreisende Kamera und Metal für die SCNView.
Für die Neugierigen erzeugte das Modell, auf dem ich mich wehrte, 231.900 Eckpunkte und 347.850 Indizes für Flächen (11.1312 MB Eckdaten (Position und Normal) und 1.3914 MB Gesichtsdaten (im Wesentlichen nur Indexpositionen von Eckpunkten in der Reihenfolge Dreiecke). ))
1) Wenn Sie auf der Mitte Ihrer generierten Oberfläche "stehen", besteht das Problem möglicherweise darin, dass Sie viel außerhalb des Bildschirms zeichnen (kein Kupieren von Kegelstumpf) und den Oberflächenbereich (einzelner Knoten) in Teiloberflächen (Kindknoten) aufteilen müssen. Es werden also nur Knoten angezeigt, die im Kameraansichtsbereich sichtbar sind.
231.900 Scheitelpunkte sind wirklich nicht viel, ich zeichne mehrere Millionen @ 60fps mit SceneKit Metal Renderer (+ 20% schneller als mit OpenGL Renderer) auf OSX.
2) Wenn Sie aus der Entfernung auf Ihre Oberflächen schauen und eine schlechte Leistung haben, prüfen Sie, wieviel bytesPerComponent:
Sie füttern, wenn Sie SCNGeometrySource
erstellen. Ich habe bei der Verwendung von CGFloat (double) eine starke Leistungseinbuße hinnehmen müssen, statt auf der GeForce GTX einfach zu schweben (bei integrierten Intel-Grafikern alles in Ordnung).