Jump to content
Unity Insider Forum

Combine Mesh


frkx316

Recommended Posts

Guten Tag 

kann mir jemand erklären wie man via script verschiedene Meshes zu einem zu Kombinieren?

Aus der Dokumentation von Unity werde ich leider nicht besonders schlau.

In wie fern ist es Performancerelavant nur ein Mesh zu nutzen?

Verringert sich dabei die Verticie Anzahl?

Wenn ich in der Scene Meshes positioniere, werden diese beim Kombinieren genauso Positioniert (also mit der Rotation)?

Wie funktionieren Submeshes und wie kann ich manuell oder via script den verschiedenen Meshes verschiedene Materiale zuweisen?

 

ich weiß das sind viele Fragen aber ich freu mich schon sehr auf eure Antworten

bleibt gesund 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Draw Call ist der Vorgang, dass die CPU zur GPU geht und sagt, sie solle doch bitte etwas malen. Mesh ist im VRAM, Shader ist im VRAM, Texturen sind im VRAM - es werden einfach nur noch die Transformationsmatrix und die Indizes dieser Sachen übergeben und die Grafikkarte legt los. Der Vorgang klingt nicht nach viel, kostet aber ein winziges bisschen Zeit. Wenn man das tausende Male pro Frame macht, summiert sich eben doch ein bisschen. Der Befehl muss halt aus der CPU raus, über das Mainboard und in die Grafikkarte geschoben werden.

Um Draw Calls zu reduzieren, gibt es Batching. Mehrere Draw Calls werden zu einem Batch zusammengefasst, wenn diese das gleiche Mesh mit demselben Material zeichnen sollen. Dann wird einmalig der ganze Batch an die GPU geschickt. Kannste selber ausprobieren: In der Game View mal oben rechts "Stats" anschalten und dann "Batches" und "Saved by batching" beobachten. Du machst dir eine leere Szene und packst einen Cube rein. Der muss im Blickfeld der Kamera sein, sonst fliegt der ja schon wegen Frustum Culling raus. Dann siehst du einen Batch. Dupliziere den Cube und du hast immer noch gleich viele Batches, und "saved" ist auf 1 gestiegen. Es werden also die Draw Calls für beide Cubes in einem Rutsch angefordert. Ändere von einem der Würfel das Material, und es klappt nicht mehr.

Wenn du das jetzt mit einer Sphere probierst, klappt es überhaupt gar nicht erst. Das liegt daran, dass Unity (aktuell!) nur bis zu 180-300 Vertices dynamisch batchen kann, je nach Meshkomplexität. Und die Sphere hat schon 515.

Wichtig bei der Aussage ist das Wort "dynamisch". Unity macht das so im Vorbeifliegen, und das kostet etwas Zeit. Deshalb tut das nur sehr begrenzt. Wenn du aber ganz oben rechts im Inspektor ein GameObject als statisch markierst, dann kann Unity die Meshes automatisch zu größeren Meshes zusammenfügen - das nennt sich dann "static Batching". Passiert voll automatisch, und der logische Preis ist einfach, dass man das Objekt nicht mehr bewegen oder löschen kann. Ist halt für die statische Welt gedacht.

Jetzt darf man aber nicht denken "cool, ich hau einfach meine ganze Szene in ein Mesh und ab dafür". Zum einen verlierst du dann Optimierungen wie Frustum Culling (man kann incht einfach den Teil des dicken Meshklumpens beim Rendern überspringen, der hinter der Kamera ist, weil er jetzt zum großen Ganzen gehört), zum anderen sind Grafikkarten die absoluten Meister in Sachen Parallelisierung, und ich vermute, da geht wieder einiges an Optimierungspotential flöten. Deshalb gibt es zwischen zu vielen Draw Calls und zu komplexen Meshes irgendwo in der Mitte einen "Sweet Spot", an dem bei gleicher Geometrie die Performance am besten ist.

Was jetzt das Kombinieren von Meshes angeht, also so, dass du das selber scriptest: Lass mal erstmal sein. Static Batching läuft schon sehr gut, wenn auch nicht perfekt. Es kann z.B. massiv auf den Speicher gehen, weil man jetzt einen Wald geladen hat statt einen einzelnen Baum und eine schlanke Liste, die besagt, wo überall einer davon stehen soll. Wie immer gilt aber: Performance wird erst optimiert, wenn sie zum Problem wird. Dinge zu optimieren, die sowieso schnell genug sind, ist Zeitverschwendung.

Hier noch was zum nachlesen:https://docs.unity3d.com/Manual/DrawCallBatching.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

vielen Dank für die ausführliche Antwort 

aber leider komm ich um das Kombinieren nicht rum 

hab mich jetzt durch die api gekämpft und es funktioniert jetzt 

trotzdem versteh ich das zuweisen der Materialen zu den jeweiligen Submeshes noch nicht ganz

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Stunden schrieb Sascha:

Wie kommt's? Machst du einen Kurs, wo das die Aufgabe ist, oder wie?

Nein das nicht 

ich schreibe zur zeit an einen Editor Script das je nach Input Meshes produziert damit der Benutzer seine eigenen Baum und Pflanzen Assets erstellen kann.

Und ich denke das es praktischer ist ein Asset zu platzieren, dass nur 1-3 Meshes benutzt(also stamm Blattwerk und blüten oder Früchte)

Schon allein das Blattwerk würde ohne das Kombinieren aus sehr vielen Blättern(Meshes) bestehen.

Aber wie gesagt hab ich es mittlerweile herausgefunden  ^^

Mfg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...