Performance verbessern / GPU Visualizer

    • Offizieller Beitrag
    • Hilfreich

    Ich weiß nicht genau wie tief dein Verständnis für die Technik dahinter reicht und deswegen weiß ich nicht genau wo ich ansetzen soll aber ich probiers mal.


    Erstmal zwei Begriffe:


    Z buffering: Beschreibt den Prozess wie dinge in Reihenfolge in 3D gezeichnet werden. Dabei wird immer erst der Hintergrund gezeichnet und dann wird wird immer mehr der Vordergrund gezeichnet. Der Hintergrund wird dadurch quasi überzeichnet.


    Wichtig hierbei zu wissen ist, das Unreal Berechnen muss, was in den Hintergrund und was in den Vordergrung gehört.

    Das hört sich einfach an ist es aber nicht. Dazu komme ich gleich noch.


    G-buffering:

    Nun kommt das buffering ins Spiel: G buffering ist quasi die Berechnung des Shadings, im G buffer werden alle Informationen gesammelt die wichtig für das Shading sind. Du hast ein Mesh, du hast eine Textur und darauf wird nun das Shading gezeichnet wenn du so willst. Die Normals werden hierbei beispielsweise berücksichtig. Bei harten Kanten ist das Shading anderst wie bei weichen kannten. Der Schatten, die Indirekte Beleuchtung und all das spielen damit rein das dass Shading letztlich so aussieht wie es aussieht.


    Im Z Buffering geht es also darum den Frame den du als Player siehst, von hinten nach vorne auf dem Monitor zu zeichnen und bei G Buffering geht es darum die Objekte korrekt aussehen zu lassen. Mit Schatten etc.


    Bei der Berechnung, können verschiedene Konflikte entstehen. beispielweise zwei Planes die exakt übereinander liegen, das wäre Z-Fighting. Kennst du vielleicht ? Genau genommen weiß hier das Z-Buffering nicht genau welche Fläche zuerst gezeichnet werden soll da ja beide Flächen auf der selben Position sind. Deswegen ist das immer random und deswegen sieht Z-Fighting so komisch aus.


    Nun aber zu deinem Problem und zu deiner Frage:

    Ich vermute einfach mal sollte ich falsch liegen, ist die Ursache die selbe das Problem aber ein anderes was du aber auf dem selben Weg beheben kannst:


    In deinem Fall hast du vermutlich viele Bäume in deiner Szene ?


    Bei Bäume musst du dir vorstellen, das Unreal berechnen muss welcher Baum ganz im Hintergrund steht und welcher Baum in welcher Reihenfolge mehr im Vordergrund steht. Das bekommt die Unreal sehr locker hin.


    Nun haben deine Bäume aber vermutlich sehr viele Planes auf der sich Blatt Texturen mit einer Alphamap befinden. Und jetzt wird es schwierig.


    Stell dir vor du stehst als Player vor einem Haus, du Schaust in ein Fenster auf die andere Seite durch ein Fenster auf ein anderes Haus das ein Fenster hat, wo du wiederum durch ein Fenster in ein anderes Haus sieht usw.


    Dieses: Ich schau durch ein Fenster in ein Fenster, in ein Fenster, in ein Fenster ist das Problem


    Unreal muss die Alpha Maps der Blätter berechnen, du schaust durch die Blätter auf weitere Blätter die ebenfalls eine Alphamap haben. Sehr vielen Blätter mit sehr vielen Alphas sind das quasi eine Unendlichkeitsrechnung.


    Kurz gesagt: Du hast offenbar sehr viel Transparenz in deiner Szene und Unreal hat große Problem das Shading im G Buffer zu berechnen. Bedenke auch, durch die Alpha soll ja auch Licht hindurch und das Z Buffering soll dass dann auch noch in Reihenfolge von hinten nach vorne zeichnen. Das eben kostet enorm viel Performance und Zeit


    Du könntest den Schatten für die Bäume und Blätter ausschalten, deine Performance sollte dann zumindest besser sein. Wenn du das schon getan hast nehme doch mal die Alphas aus der Blatt Textur raus, dann sollte deine Performance besser sein da nicht mehr viele Transparenz Berechnungen durchgeführt werden müssen.

  • Hey Sleepy,


    danke für die ausführliche Erklärung .

    Ich habe Schatten ganz entfernt(werde dazu nochmal einen Thread eröffnen, wenn ich im nächsten Projekt mit Schatten arbeite) und die Bäume habe ich auch mal entfernt, um es zu testen aber ich gewinne nur ca 2-3 FPS.

    Ich dachte ich zoom mal raus, um zu sehen was alles Leistung zieht, habe nur das Problem mit der Transparenz, wenn ich die komplette Map sehe.
    Benutze auch Fog Planes und viel Wasser.

    Laufe ich z.b. im Wald habe ich ca 29-33 FPS, was auch nicht ganz zufriedenstellend ist.



    Nun habe ich verstanden was gemeint ist mit BasePassParallel, aber wie gehe ich nun vor mit meine Materials? Was zieht bei Materials am meisten an performance?


    Ich würde zugern das alles mal lernen, aber finde kein Weg, wo ich es gut lernen kann.

    • Offizieller Beitrag

    Schwierig dass so zu sagen. Ich bin mir nicht mal sicher ob die Materials alleine die Ursache sind.

    Was auf jeden Fall viel frisst ist die Transparenz, Reflektionen und die Material bzw Textur Größe.

    Wenn das alles 4k Texturen sind, würde mich nicht mehr wundern :)


    Ich Frag mich, wie es mit deinen Drawcalls aussieht ? Auch Materials verursachen Drawcalls daher kann das schon zusammenhängen.

  • So richtig aussagekräftig sind ja Gesamtmessungen auch nicht. Sie sagen ja erstmal, dass du viel Rechenpower verbrauchst, aber nicht genau wo.


    Besser wäre es, wenn du deinen Viewmode mal umschaltest, unter Optimazion Viewmodes ⇒ Shader Compexity.


    Da kriegst du dann ein ähnliches Bild, wie man es von Wärmebildkameras her kennt zu sehen, inkl. einer Skala. Und je mehr Performanze ein Shader von dir benötigt, um so weiter rechts geht dieser in den Farbbereich der Skala. Die kannst du dir dann mal genauer anschauen, bzw. müsstest sie hier vielleicht mal zeigen, sodass man nachsehen kann, ob es da Möglichkeiten der Optimierung gibt.

  • Schwierig dass so zu sagen. Ich bin mir nicht mal sicher ob die Materials alleine die Ursache sind.

    Was auf jeden Fall viel frisst ist die Transparenz, Reflektionen und die Material bzw Textur Größe.

    Wenn das alles 4k Texturen sind, würde mich nicht mehr wundern :)


    Ich Frag mich, wie es mit deinen Drawcalls aussieht ? Auch Materials verursachen Drawcalls daher kann das schon zusammenhängen.

    • Offizieller Beitrag

    Das sind nicht die Drawcalls der Basepass ist ein Teil des Renderprozesses (G-Puffering)


    Ein Drawcall ist im grunde ein Befehl den deine CPU deiner GPU gibt. Und sagt: "Hey zeichne etwas auf den Bildschirm"

    Alles was gezeichnet werden muss, ist ein Drawcall. Das ist zb ein Mesh, Material, Schatten usw alles eben gezeichnet werden muss.


    Hast du zb viele Materalien, so wird deine GPU mit befehlen überflutet und deine GPU kommt nicht mehr hinterher alle Informationen zu bearbeiten.

    Damit gehen deine FPS nach unten weil Unreal es nicht schafft 60 Frames pro Sekunde auf den Bildschirm zu Zeichen.

    Bei schnellen spielen brauchst du aber 60 FPS damit du Bewegungen als Flüssig wahrnimmst.

    Hast du weniger FPS, dann hast du eben diese bekannten Lags wo dein Rechner bestimmte Frames einfach auslässt und den nächsten oder den übernächsten Frame zeichnet.


    Weniger Drawcall erreichst du in dem du die Anzahl der Befehle die an die GPU gesendet werden müssen verringerst.

    Stell dir ein Drawcall wie wie Brief vor den von deiner GPU geöffnet und gelesen werden muss.


    1.Du hast sehr viele Briefe die geöffnet und gelesen werden müssen

    2.Du hast dicke Briefe die gelesen werden müssen.


    Diese dinge musst du reduzieren.


    1.Wenn du zb Meshes miteinander verbindest (Combine), hast du weniger Objekte und damit weniger Drawcalls.

    2.Wenn du statt 4k Texturen 1k Texturen verwendest, sind deine Drawcalls weniger dick und deine GPU muss weniger Informationen interpretieren.


    Nur ganz so einfach ist das jetzt auch wieder nicht weil Unreal auch eine Reihe von Methoden verwendet um mehr Performance rauszuholen.

    Dazu gehören beispielweise die Culling Methoden.


    1.Das Backface Culling ist einer dieser Methoden. Dabei wird die Rückseite eines Polygons nicht gezeichnet. Das kennst du wenn du gedrehte Normals hast, das diese Flächen dann unsichtbar sind. Bei Baumblätter möchte man aber dass die Blätter Twosided sind. Hier wird das Culling also nicht angewendet. Deswegen macht es Sinn eine Wand nicht auf Two Sided zu stellen sondern eine Wand doppelwandig zu machen.

    Wenn deine Wand eine Plane ist, hast du bei zwei Planes statt 2 Tris zwar 4 Tris pro Wand aber dafür muss die Engine die Rückseite des Polygons nicht berechnen. Wohl gemerkt, dass man die Rückseite eh nicht nicht sieht da du dich ja vor der Wand befindest.



    Wichtig an dieser Stelle: Relevant für die Performance ist nicht die Levelgröße auch nicht wie viele Meshes in deinem Spiel sind sondern wie viele Meshes, Materials usw IN EINEM FRAME zu einer bestimmten Zeit zu sehen sind.


    Es bringt also nicht wenn du dein Spiel startest, dich in eine Ecke stellst du sagst "Hey mein Spiel hat 20 FPS großartig"


    Deine Drawcalls, und deine Performance gehen rauf und runter. Du hast stellen in deinem Spiel wo die Performance gut ist und du hast stellen wo sie schlecht ist.


    2. Die Visibility Culling ist ein wichtiges Werkzeug. Es Blendet Meshes aus die nicht im Sichtbereich des players sind.


    Nehmen wir an dein Player befindet sich in einem Haus. Das Haus ist ein einziges Mesh mit Möbel, Dachziegel usw. Dein Haus hat jetzt genau 1 Drawcall. Aber da dein mesh so riesig ist, kann das Culling nicht richtig funktionieren.
    Das Haus mit allem drum und dran ist entweder komplett eingeblendet oder komplett ausgeblendet.


    Schaust du im Haus in der Decke auf den Boden, so wird immer das ganze Haus gezeichnet. Das ist der Killer für die Performance.


    Du kannst das Haus sinnvoller aufteilen: zb Außenfassade, die Wände innen, dass Dach so kann Unreal richtig Atmen und ausblenden was nicht gesehen wird. Klar hast du dadurch mehr Meshes die auch mehr Drawcalls verurachen aber normalerweise siehst du ja nie das ganze Haus. Wenn du innen bist, sieht die die Fassade außen nicht, du siehst nicht die Ziegel usw.



    3. Occlusion Culling

    Das Occlusion Culling ist schnell erklärt, es Zeichnet Modelle NICHT ,die von einem andern Mesh im Vordergrund verdeckt werden.

    Hier gilt das selbe, werden Meshes miteinander Verbunden (Combine), so ist es ein einziges Mesh dass entweder komplett eingeblendet oder Komplett ausgeblendet ist.




    4. FAR und Near Distance.

    Far Distance, Objekte in einer gewissen Entfernung werden einfach nicht gezeichnet und erst ab einer bestimmten Entfernung eingeblendet. Das kennst man von vielen Spieln wo im Hintergrund Langsam die Modelle auftauchen.


    5.Die LODs ein Haus kann in einer weiter Entfernung einfach nur ein Cube mit eine Mixelmatsch Textur sein. Hier werden häufig sehr niedrig aufgelöste Texturen verwendet. zb 64 * 64 Pixel.

    Damit kannst die FAR nur Near Distance Geschichte ein bisschen umgehen und doch Häuser in großer Entfernung einblenden.


    In dem Video geht es zwar eher um den Schatten aber man sieht auch die Cullingverfahren im Hintergrund sehr gut.

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    WICHTIG: LODs gelten nicht nur für Meshes von niedrigem bis hoher Polycount sondern auch für Texturen von niedriger bis hoher Auflösung je nach Entfernung. Für ein Mesh das weit entfernt ist, brauchst du keine 2k Textur und schon gar keine 4k Textur.



    Hab ich noch irgend was vergessen ?


    Alle diese Verfahren sorgen für eine bessere Performance wenn sie korrekt angewendet werden. Macht man hier fehler, funktionieren die Cullingverfahren nicht oder sorgen genau für das Gegenteil was sie eigentlich sollen.


    Mehr Infos findest du hier: https://docs.unrealengine.com/…aphics/VisibilityCulling/


    Zum Thema Drawcalls schau dir einfach dieses Video an zieh dir die Konsolenbefehle rein:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Diese ganzen Zahlen bringen dir nichts, wenn du nicht weiß wie du mehr Performance rausholen kannst. Deswegen oben diese lange Erklärung.


    Das was Tomarr geschrieben hat, kannst du dir auch anschauen. Viewport Visualisierungen helfen dir dabei die Übeltäter zu finden.