2016-05-20 7 views
0

Ich bin gerade dabei, eine Voxel-Engine zu entwickeln, um mich mit vielen der beteiligten Konzepte vertraut zu machen. Es ist auch eine Übung in der Optimierung für mich. Bei der Suche habe ich mehrere Quellen auf verschiedenen Websites gesehen, die darauf hinweisen, dass ich ModelBuilder(). CreateBox() oder createRect() nicht zur Fehlerbehebung verwende.Warum sollte excatly nicht LibGDX createBox oder createRect verwenden?

Stattdessen empfehlen sie, Ihre eigenen Würfelmodelle in etwas wie blender zu erstellen, anstatt diese anstelle von createBox zu verwenden. Ich bin gerade mit der Implementierung von Culling für die Optimierung fertig geworden, und das Umschreiben meines Codes für die Umstellung auf benutzerdefinierte Modelle würde einige Zeit in Anspruch nehmen. Ich möchte verstehen, was ich mache und warum ich es mache, bevor ich mich auf so etwas beginne.

Warum genau wird createBox nicht empfohlen? Ist das Erstellen individueller Modelle wirklich die beste Idee in dieser Situation?

Antwort

1

ModelBuilder#createBox Die Methode ist eine bequeme Methode eine Model mit einem einzigen Node zu schaffen, die einen einzelnen NodePart enthält, die einen einzelnen Kastenform enthält. Es ist genau die gleichen wie tun:

ModelBuilder builder = new ModelBuilder(); 
builder.begin(); 
builder.node(); 
MeshPartBuilder mpb = builder.part("box", primitiveType, attributes, material); 
BoxShapeBuilder.build(mpb, width, height, depth); 
model = builder.end(); 

Es schafft ein Mesh Objekt, das eine OpenGL-Ressource ist, die (in Abhängigkeit von den Attributen) nur 8 oder 24 Knoten und 36 Indizes. Wenn es nicht die einzige Sache ist, die Sie rendern möchten, ist es sehr schlecht für die Leistung, so kleine Mesh zu haben.

Dies ist, weil jede Mesh (oder (Teil) einer Node) einen Render-Aufruf impliziert. Dies bedeutet, dass es warten muss, bis der vorherige Render-Aufruf abgeschlossen ist und die CPU und die GPU synchronisiert sind. Es wäre viel leistungsfähiger, so viele Formen wie möglich in einen zu kombinieren und das sofort zu rendern. Schließlich soll die GPU parallel auf mehreren Knoten gleichzeitig ausgeführt werden.

Dies ist der gleiche Grund wie z. SpriteBatch kombiniert so viele Sprites wie möglich, bevor es gerendert wird. Und es ist auch der Grund, warum die Verwendung einer einzelnen TextureAtlas für die Leistung besser ist als die Verwendung separater Texturen.

Wenn Sie also eine Voxel-Engine mit Modellen erstellen, die nur eine einzige Box enthalten, würden Sie Tausende von Renderaufrufen erhalten. Das wäre so langsam, dass es dein Spiel praktisch unspielbar machen würde.

Ofcourse, die Lösung so einfach ist, einfach mehrere Boxen zum Teil hinzufügen:

ModelBuilder builder = new ModelBuilder(); 
builder.begin(); 
builder.node(); 
MeshPartBuilder mpb = builder.part("box", primitiveType, attributes, material); 
BoxShapeBuilder.build(mpb, x1, y1, z1, width1, height1, depth1); 
BoxShapeBuilder.build(mpb, x2, y2, z2, width2, height2, depth2); 
//... 
BoxShapeBuilder.build(mpb, xn, yn, zn, widthn, heightn, depthn); 
model = builder.end(); 

Die ModelBuilder#createBox (und andere erstellen Methoden) verbergen diese Logik, die es weniger offensichtlich zu sehen, macht, was los ist hinter den Kulissen und wie leicht es optimiert werden kann. Deshalb werde ich diese Methoden wahrscheinlich eines Tages entfernen. Leider sind die createXXX Methoden sehr hilfreich für Anfänger, die die 3D API lernen (z. B. ich verwende sie in der tutorials auf meinem Blog), die einen schnellen Start wollen. Aus diesem Grund habe ich sie immer noch nicht entfernt.

Btw, mit ModelBuilder für eine Voxel-Engine ist ein Overkill. Vielleicht möchten Sie stattdessen einen Blick auf this tutorial werfen, wo ich eine einfache Möglichkeit zeige, einfache Formen zur Laufzeit zu kombinieren. Die neueste Version von libGDX enthält sogar ShapeCache, was praktisch funktioniert, was Sie direkt als Voxel verwenden können.

Ich bin mir nicht sicher, warum Sie denken, dass das Erstellen einer Box in einer Modellierungsanwendung anders als das Erstellen von Code ist. Vielleicht können Sie mit der Referenz verlinken, wo Sie das gefunden haben.

+0

Danke für die Antwort, Es macht jetzt viel mehr Sinn. Ich war mir nicht ganz sicher, warum das Erstellen eines Modells in einem Programm anders als das Erstellen eines Modells in einem Code ist, was ein Grund ist, warum ich gefragt habe, ob ich herausfinden kann, wo ich diesen Vorschlag lese. auch, die Kombination mehrerer Formen in einem einzigen Netz sollte nicht die Fähigkeit beeinflussen, die Sie mit jedem individuell richtig interagieren können? So wie sie gerendert werden. Ich werde auf jeden Fall einen Blick auf Ihr Tutorial werfen, sieht aus, als ob ich mehr Sachen zu lernen habe! –

+0

In der Tat sollten Spiellogik und Renderlogik getrennt werden. Sie sollten nur Teile aktualisieren, deren Inhalt sich tatsächlich geändert hat (und sichtbar sind). – Xoppa

Verwandte Themen