Optimieren bis der Arzt kommt

  • Hallöchen an alle Entwickler :bye:


    Hab mich eben mal aus Interesse (und Langeweile :lol: ) im Thread "Pflanzen in Open World" umgesehen und da kam ein sehr wichtiges Thema bei auf: Performance Optimierung des Games, damit es auch auf Opas alter Röhre gespielt werden kann. Anders als der nette Herr Threadersteller im besagten Thread, bin ich da sehr vorsichtig, da ich mich genug mit Blender auseinandergesetzt habe, um zu wissen, dass Objekte mit hoher Polygonanzahl irgendwann selbst einen i9-Prozessor mit RTX 5080 den Schweiß auf die digitale Stirn treiben würde.


    Mich interessiert daher, wie man das bestmöglich optimieren kann, da ich mal irgendwann gelesen habe, dass mit der Unreal Engine es möglich sein soll, selbst Low Polygon-Objekte der Marke "Strichmännchen" wie ein hochauflösendes Objekt a là Kratos wirken lassen kann, das enorm viele Details zeigt, die eigentlich gar nicht vorhanden sein dürften. Wer darüber mehr weiß, gerne hier rein. :)

  • So ist es ja nun auch nicht. Also Informationen, die nicht vorhanden sind, können natürlich auch nicht dargestellt werden. Die Unreal Engine und auch die Grafikkarten Hardware, trickst zwar schon sehr viel herum, um die Performance zu verbessern, wie Upscaling per KI-Routinen usw. Das ist jetzt aber kein Ersatz für so viele Polygone wie nötig, so wenig wie möglich.

    Man kann halt auch in die neuen Algorithmen nicht jede Grütze an Polygonmatsch reinwerfen und dann erwarten, dass die Engine und Grafikkarte schon etwas Brauchbares draus macht. Viele scheinen das aber so zu sehen. Man sollte trotzdem auf eine saubere Topologie in den Meshes achten. Ich habe mich inzwischen auch etwas mehr mit Blender beschäftigt, vorher eher nur mit Blueprints, und eigentlich braucht man gar nicht so viele Polygone und Vertexes, um wirklich gute Modelle zu erstellen.

    Wie gesagt, so viele wie nötig, so wenig wie möglich. Und vor allem sauber angeordnet. Das dürfte in den meisten Fällen das Hauptproblem sein. So irgendwelche Verknotungen aus dem Mesh herauszubekommen. Das ist die halbe Miete. Wenn es Blender vielleicht noch nicht stört, weil er einfach nur ein Bild berechnet, dafür theoretisch auch endlos Zeit hat, die Engine wird es stören, weil sie möglichst schnell, möglichst viele Bilder berechnen muss.

    🎭 Jester's Workshop – Der Discord-Server für Unreal-Entwickler

    *Der Narr hat sein Zelt aufgeschlagen – und du bist eingeladen.*


    🔗 Direkt beitreten:

    Jester's Workshop


    ---


    **Seriously Unhinged**

    • Offizieller Beitrag

    Für Anfänger ist Performance-Optimierung oft ein sehr frustrierendes Thema, weil viele Tutorials nur sagen „optimiert eure Assets“, aber selten wirklich erklären, wie Rendering eigentlich funktioniert.

    Grundsätzlich kostet alles Performance, was gezeichnet oder berechnet werden muss.

    Die CPU und GPU arbeiten dabei zusammen:

    • Die CPU organisiert die Szene und bereitet Renderbefehle vor
    • Die GPU zeichnet anschließend das Bild auf den Bildschirm

    Man kann sich die CPU wie einen Boss vorstellen, der der GPU ständig Befehle schickt. Diese Befehle nennt man Draw Calls.

    Ein Draw Call bedeutet vereinfacht:

    „Zeichne dieses Objekt mit diesem Material an dieser Position.“

    Problematisch wird es, wenn die CPU tausende einzelne Befehle vorbereiten muss.

    Schlechtes Beispiel:

    • 1000 einzelne Bäume
    • jeder Baum eigenes Mesh
    • eigenes Material
    • eigener Draw Call

    Dann muss die CPU extrem viele Befehle vorbereiten, obwohl die GPU eigentlich schnell genug wäre.

    Das nennt man oft „CPU-bound“.

    Darum ist Instancing so wichtig.

    Beim Instancing sagt die CPU vereinfacht:

    „Zeichne dieses Objekt 1000-mal an unterschiedlichen Positionen.“

    Dadurch reduziert man massiv den CPU-Overhead.

    In der Unreal Engine funktioniert das z. B. über:

    Wichtig:

    Ein Objekt mehrfach neu zu importieren ist NICHT Instancing.

    Richtiges Instancing bedeutet:

    • ein gemeinsames Mesh
    • viele Instanzen desselben Meshes

    Deshalb sind nicht nur Polygone wichtig, sondern auch:

    • Draw Calls
    • Materialien
    • Transparenz
    • Schatten
    • Shader
    • Anzahl einzelner Objekte

    Typische Dinge, die Rendering teuer machen:

    1. Viele einzelne Meshes
    2. Viele unterschiedliche Materialien
    3. Transparente Materialien wie Glas, Rauch oder Partikel
    4. Dynamische Schatten
    5. Animierte Skeletal Meshes
    6. Komplexe Shader

    Deshalb ist Optimierung oft ein Balanceakt.

    Ein großes Haus als EIN Objekt:

    • gut für Draw Calls
    • schlecht für Occlusion Culling

    Viele kleine Einzelteile:

    • gut fürs Culling
    • schlecht für Draw Calls

    Man muss also sinnvoll aufteilen.

    Beispielsweise:

    • Außenfassade separat
    • Räume separat
    • entfernte Bereiche über LODs vereinfachen

    LODs betreffen übrigens nicht nur Meshes.

    Auch Materialien und Texturen können LODs besitzen:

    • weit entfernte Objekte → kleine/verwaschene Texturen
    • nahe Objekte → hochauflösende Texturen

    Ein weiterer wichtiger Punkt ist Occlusion Culling.

    Die Engine rendert idealerweise nur das, was die Kamera tatsächlich sehen kann.

    Wenn du vor einem Gebäude stehst:

    • muss nicht berechnet werden, was hinter dem Gebäude liegt
    • eventuell auch nicht, was mehrere Räume weiter entfernt ist

    Darum ist Szenenaufbau extrem wichtig.

    Am Ende gibt es nicht „den einen richtigen Weg“.

    Performance-Optimierung bedeutet immer:

    Qualität, Speicher, CPU, GPU und Sichtbarkeit sinnvoll gegeneinander abzuwägen.

  • Ja guuut .... :/ ... Das sind jetzt erst einmal ordentlich viele Infos von euch allen. Vielen lieben Dank schon einmal dafür. :)


    Nur das mit diesem F5 drücken, das kapiere ich irgendwie nicht so ganz. Und warum dann die unterschiedlichen Farben schlecht sein sollen. :/ :/

  • Ja guuut .... :/ ... Das sind jetzt erst einmal ordentlich viele Infos von euch allen. Vielen lieben Dank schon einmal dafür. :)


    Nur das mit diesem F5 drücken, das kapiere ich irgendwie nicht so ganz. Und warum dann die unterschiedlichen Farben schlecht sein sollen. :/ :/

    Die Engine, bzw. der Editor zeigt dir dann an, wie teuer, also an Rechenaufwand, die Materialdarstellung/Berechnung ist. Transparente Materialien sind zum Beispiel meistens sehr teuer.

    Es gibt für ein Spiel aber noch wesentlich mehr Möglichkeiten der Optimierung. Nicht nur bei Meshes oder Materialien. Sehr beliebt ist auch bei vielen im Actor hinter dem Tick eine ganze Logikkette aufzubauen, inkl. Branch und allem drum und dran. Das kostet mit jedem Tick Rechenzeit.

    Und natürlich hat Tick seine Berechtigung. Aber ich behaupte mal bei 90 % der Actoren, kannst du den Tick rausnehmen und lieber mit Eventdispatchern und Interfaces Arbeiten. Das bringt sehr viel. Denn, du darfst nicht vergessen, ein Tick wird pro Frame ausgeführt. Das ist, je nachedem, 30, 60, 120 Mal pro Sekunde, und jedes Mal wird dann ein Branch abgefragt, welches sich zu 99 % nicht ändert. Da sparst du halt eine ganze Menge, wenn du den TRUE-Zweig erst auslöst, wenn er tatsächlich zutrifft und abgearbeitet werden muss. Bei zig Actoren im Level sparst du da wirklich extrem viele Berechnungen.

    🎭 Jester's Workshop – Der Discord-Server für Unreal-Entwickler

    *Der Narr hat sein Zelt aufgeschlagen – und du bist eingeladen.*


    🔗 Direkt beitreten:

    Jester's Workshop


    ---


    **Seriously Unhinged**