sehr viele Objekte anzeigen

Started by heke, July 14, 2016, 10:02:25 PM

Previous topic - Next topic

heke

Guten Tag,
ich habe da mal eine Frage wie man etwas besser machen kann, aber erstmal danke für die geniale Engine, nutze jpct-ae.

So, fangen wir mal an. Ich möchte eine Ansicht erstellen, die dem Spiel Minecraft zusammen hängt. Ich verbinde mich mit einem Server und der liefert mir Koordinaten wo jeder Block ist, den ich Grafisch anzeigen lassen möchte.
Soweit ist alles gut, nur leider ist ein Chunk 8x8x256 Blöcke groß und das wird echt zuviel, kann man das irgendwie Ressourcend schonen programmieren?
Desweiteren habe ich ein Problem, das wenn zu viele Objekte angezeigt werden und ich nur noch Objekte in der ferne sehe aber nicht mehr direkt vor mir.

ich hoffe Sie können mir helfen.

EgonOlsen

Das mit der Sichtbarkeit bekommst du in den Griff, wenn du diesen Wert hier änderst, bevor du die World-Instanz erzeugst:
http://www.jpct.net/jpct-ae/doc/com/threed/jpct/Config.html#maxPolysVisible

Aber das ist natürlich wirklich ziemlich viel...ist es wichtig, dass das wirklich in Echtzeit läuft oder reicht es, eine aktuelle Ansicht zu zeichnen, die sich dann nicht bewegt? Im letzteren Fall, könnte man mit der Performance vermutlich leben. Dann wäre nur wichtig, dass nicht jeder Block ein eigenes Mesh ist. Das bekommst du hin, indem du diese Daten zwischen den Objekten teilst: http://www.jpct.net/wiki/index.php?title=Reducing_memory_usage#Reduce_memory_usage_of_objects, also quasi


Object3D blueprintBlock=...
...
Object3D newBlock=new Object3D(blueprintBlock, true);
newBlock.shareCompiledData(blueprintBlock);
...


Wenn es auch schneller laufen muss...hmmm...Minecraft ist eine spezielle Engine, die genau für diesen Fall gebaut ist. Die einzelnen Blöcke sind nicht wirklich einzelne Blöcke, sondern zu größeren Objekten zusammengefasst, die ständig umgebaut werden. Darauf ist jPCT nicht wirklich optimiert. Ich sehe drei Möglichkeiten, alle sind aber nicht trivial:


  • Die Blöcke als einzelne Objekte lassen und stattdessen irgendwie einen schnellen Weg finden, nicht sichtbare Objekte auszublenden. Wie? Gute Frage, muss man sich was einfallen lassen. Es müsste ja nicht perfekt sein...
  • Die Blöcke in größere Objekte zusammenfassen, z.B. jeweils einen 8*8 Block definieren, der in seinem inneren aus kleinen Objekten besteht (aber trotzdem ein Object3D ist). Dann könnte man über eine Implementierung von IVertexController/GenericVertexController die nicht benötigten Teilblöcke zwar nicht entfernen, aber doch koordinatentechnisch so zusammen- (oder weg-) schieben, dass sie nicht mehr sichtbar sind. Klingt komisch, wurde aber schon erfolgreich gemacht. Ist nur fummelig.
  • ...oder man versucht sich am Ansatz von Redman, den er neulich gepostet hat: http://www.jpct.net/wiki/index.php?title=Instance_Batch_Rendering. Das habe ich aber selber noch nicht ausprobiert, von daher kann ich dazu erstmal nicht viel mehr sagen.

heke

ok, das mit der Sichtbarkeit funktioniert teilweise, habe den wert erhöht, nur leider habe ich immer noch das Problem, das wenn ich zum beispiel etwas nach unten sehe (Kamera drehe) ich durch die Objekte die näher an der Kamera sind verschwinden und ich Objekte sehe die weiter weg sind.

das 2te muss ich noch etwas testen

EgonOlsen

Dann hast du den Wert nicht hoch genug gesetzt. Du bekommst normalerweise eine Meldung (einmalig) im Log, wenn die Anzahl der Objekte den konfigurierten Wert übersteigt.

heke

ok, ja es sind im test 16325 objekte und nur 1000 polys eingestellt
wenn die kamera gut steht reicht das auch, aber leider zeigt er meist die an, die weiter weg sind, naja da probier ich noch etwas rum

das mit
Object3D newBlock=new Object3D(blueprintBlock, true);
newBlock.shareCompiledData(blueprintBlock);


hab ich ausprobiert und was soll ich sagen, die zeit zum laden hat sich erstmal halbiert  ;D