frkx316 Geschrieben 31. Mai 2020 Melden Share Geschrieben 31. Mai 2020 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 More sharing options...
Sascha Geschrieben 31. Mai 2020 Melden Share Geschrieben 31. Mai 2020 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 More sharing options...
frkx316 Geschrieben 1. Juni 2020 Autor Melden Share Geschrieben 1. Juni 2020 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 More sharing options...
Sascha Geschrieben 1. Juni 2020 Melden Share Geschrieben 1. Juni 2020 vor 39 Minuten schrieb frkx316: aber leider komm ich um das Kombinieren nicht rum Wie kommt's? Machst du einen Kurs, wo das die Aufgabe ist, oder wie? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
frkx316 Geschrieben 1. Juni 2020 Autor Melden Share Geschrieben 1. Juni 2020 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 More sharing options...
Sascha Geschrieben 1. Juni 2020 Melden Share Geschrieben 1. Juni 2020 Ah, klingt sinnvoll. Schön, schön! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.