kompilierte/nicht kompilierte Objekte und buildAllObjects

Started by Socke, November 18, 2012, 01:03:07 PM

Previous topic - Next topic

Socke

Ich probiere gerade mit der Geschwindigkeit rum. Leider scheint diese im Vergleich zu DirectX Spielen wesentlich schlechter. Dabei passieren auch komische Sachen die ich nicht verstehe.

Ich habe neben einem Boden mit Textur noch ein paar Kugeln in Blender erstellt. Immer mit Copy Paste.

Object 'Sphere.127_jPCT0' created using 960 polygons and 482 vertices.
Processing object from 3DS-file: Sphere.126


Es sind also ca. 130 Objekte. Wenn ich jetzt "object3d.compile();" anwende sieht die Szene so aus. Die Frames brechen von fast 3000 auf fast 300 ein. In einem anderen Thread in diesem Forum habe ich gelesen das Millionen von Polygonen normal wären bei aktuellen Spielen. Davon bin ich hier ja noch weit entfernt.
Ich benutze 4 anti aliasing und Config.glAnisotropy steht auf 2.
Ist das normal oder mache ich etwas falsch?



Ohne "object3d.compile();" kommt es zu Grafikfehlern.


Mit "object3d.compile();" und "mainWorld.buildAllObjects()" vor der render Schleife werden Kugeln irgendwie verdreht. Der Boden aber nicht. Obwohl alles in einem 3DS ist und mit folgendem geladen wird.

Object3D[] tests = Loader.load3DS("models/course1.3ds", 1);
for (Object3D object3d : tests) {
object3d.rotateX((float) Math.PI/2*-1);//mit nem halben PI werden die objekte horizontal angezeigt. Man muss aber den negativen Wert nehmen sonst steht alles auf dem kopf
if (object3d.getName().contains("boden"))
object3d.setTexture("boden");
object3d.compile();
curses.addElement(object3d);
}






EDIT:
Fast vergessen. Ich habe ne Gefoce 470 und nen 6 (echte)Core AMD Prozessor.


EgonOlsen

Ich würde sagen, du machst dir ein wenig zu viel Gedanken über die Geschwindigkeit...zumal dein Test sehr synthetisch ist. OpenGL ist vielleicht etwas langsamer als DirectX bzw. die Treiber sind nicht ganz so optimiert. Aber es reicht eigentlich immer aus. 300fps für 130 Objekte mit insgesamt ~130.000 Polygonen ist ja so schlecht nun nicht. Das sind immerhin fast 40 Millionen Polygone/Sekunde.

Wie auch immer, zu deinen Fragen:

Ohne compile() ist es wesentlich langsamer und du benötigst eine wesentlich größere Visibilitylist. Das kannst du in Config.maxPolysVisible vorgeben. Du solltest eigentlich im Log auch eine entsprechende Warnung mit diesem Hinweis finden.

Der Unterschied zwischen build() und nicht build() (wobei du immer build() aufrufen solltest, ansonsten hast du wenig Spaß, wenn du z.B. Lichtquellen ergänzt) kommt daher, dass build() auch das Rotationspivot berechnet. Deine Rotationen laufen also mit und ohne build() um verschiedene Pivots und daher sieht das Ergebnis anders aus.

Dein Test ist wie gesagt sehr synthetisch. Du hast 130 gleichförmige Objekte ohne Beleuchtung und die sind auch noch alle sichtbar. Die ganzen Tricks, die die Engine aufbieten könnte, um eine Szene bestmöglich zu berechnen, laufen hier ins Leere.

Was deine CPU angeht: Die Beta hat (noch undokumentiert) eine neue Klasse dabei, mit der sich die Berechnungen (nicht das Rendern) bei vielen Objekten auf mehrere Threads verteilen lässt. In der nächsten offiziellen Version ist das dann auch dokumentiert.

Socke

Acha. OK bin jetzt schlauer. 40 Millionen Polygone pro Sekunde sind genug  ;D

Nur das mit dem build() stört mich noch etwas.

Wenn ich jetzt, wie auf den Bildern zu sehen, ein Level mit einem 3D Editor wie Blender erstelle und es dann lade und build() drüber laufen lasse dann wird alles verdreht und ich muss jedes Objekt wieder einzeln korrigieren? In Blender sah das Level wie auf Bild 1 aus.

Oder kann ich irgendwie rausfinden was wie verdreht wird? Wie gesagt, der Boden und die Kugeln werden im Quellcode gleich behandelt. Kommen aber nicht gleich wieder raus.

Vielleicht sollte ich auf jedes Objekt einzeln build() aufrufen? Ist jetzt zu spät, probiere ich morgen nochmal aus.

EgonOlsen

build() "verdreht" nichts. Verdrehen tust du durch die Rotation. Ohne build() findet die um den Ursprung statt, mit build() um das berechnete Rotationspivot. Du kannst mal versuchen, ob dir das Ergebnis eher zusagt, wenn du vor dem Laden Config.useRotationPivotFrom3DS=true setzt. Dann nimmt er die Rotationspivots aus der Datei.