Performance verbessern / CPU

  • Hallo,


    ich hatte mal um Hilfe gebeten, wie ich die Performance verbessern kann mit hilfe des GPU Visualizer:
    Hier zum Thread : Performance verbessern / GPU Visualizer


    Nun bräuchte ich nochmal Hilfe mit meinem CPU Problem.^^




    So wie ich es sehe ist mein größtes Problem : WorldTickTime und TickTime.

    Kann mir einer sagen was das genau bedeutet, was ich verbessern kann oder wo ich mal genauer gucken sollte das diese verursacht.

    • Offizieller Beitrag

    Ich hohl bisschen weiter aus:

    Du hast ja Frames die werden in einer bestimmten Anzahl pro Sekunde auf den Monitor gezeichnet.

    zb 60 Frames pro Sekunde.

    Ein Frame bedeutet gleichzeitig auch ein Tick. Wird ein Frame gezeichnet, wird gleichzeitig ein Tick ausgelöst.

    Du kennst vielleicht auch das Tick Event ? Dieser Event wird um grunde immer dann ausgeführt wenn ein Frame angezeigt wird.


    Ein TIck ist ein Floatwert der über die Deltatime gemessen werden kann, bzw es kann die Zeit zwischen den Ticks gemessen werden.




    Über die Deltatime kannst du also auch die Länge des Lags messen und beispielsweise bestimmte Ereignisse zurücksetzen.


    Ein Hoher Tickwert bedeutet, dass pro Frame sehr viel passiert.


    In der Theorie:

    Wenn du viele Event Ticks verwendest und in jedem Tick 1 Millionen Cubes um 1 Meter verschieben würdest, dann würdest du im pro Frame 1 Millionen Cubes verschieben. Bei 60 Frames pro sekunde wären dass 60 Meter in der Sekunde :)


    Wobei du vielleicht mit einem Quanten Computer 60 Frames pro Sekunde hättest.

  • Wobei du vielleicht mit einem Quanten Computer 60 Frames pro Sekunde hättest.

    Wenn du keinen NASA-PC hast, kann ich dir auch "Set Actor Tick Enabled" empfehlen. Mit dem lässt sich der Tick gezielt verwenden.

    Meiner Erfahrung nach lassen viele gerne etwas "on Tick" laufen, weil es einfach erscheint. Aber die meisten Events/Functions müssen das nicht unbedingt

  • Aber ich habe nicht so oft Event Ticks benutzt und mittlerweile haben ich 28 FPS. Ich kann all meine Grafikeinstellung auf Low stellen also auf den Wert 0 und habe keine FPS gewonnen dadurch.

    Ich habe auch FPS Limit auf unendlich also auch auf den wert 0 gesetzt, daran liegt es nicht.


    Ich denke mal das sind alles Einstellung die auf die GPU gegen und meine Ticks sehen doch nicht normal aus oder?

    • Offizieller Beitrag

    Nur um nochmal die Begrifflichkeiten zu erklären. Das Menschliche Auge braucht eine bestimmte Anzahl an Frames damit eine Bewegung als Flüssig empfunden wird. Bei schnellen spielen wie beispielsweise Rennspielen, Shooter, braucht man mehr Frames da mehr Frames pro Sekunde Angezeigt werden müssen.

    Bei einem Frame drop, laggt das Spiel da der Rechner bzw meist deine CPU nicht hinterherkommt befehle an deine Grafikkarte zu übermitteln. Wahrscheinlich wäre die GPU in der Lage diese Informationen zu bearbeiten aber die CPU und hier der Befehlshaber.

    Diese Befehle die von CPU an die GPU gesendet werden, nennt man auch Drawcall.


    Ich hab das hier im Forum schon ein paar mal erklärt:

    Ein Drawcall ist ein Brief der die CPU an die GPU sendet, deine GPU muss all diese Briefe öffnen und sie auf deinem Bildschirm darstellen. Viele Drawcalls bedeuten viele Briefe und somit viele Befehle.


    Viele Objekte bedeuten viele Drawcalls, pro objekt ein Drawcall

    Dynamischer Schatten bedeuten Drawcalls

    Je Material ein Drawcall


    Die Tickrate ist der Prozess der während deines Spiels für die Objekt Aktualisierung zuständig ist.

    Viele Objekte also viel geticke.

    Ein Tick regelt somit die Position, die Geschwindigkeit, die Animationen und andere Eigenschaften jedes Objektes.


    Oder anderst: Die Tickrate gibt an, wie viele Aktualisierungen pro Sekunde und pro Objekt durchgeführt werden.


    Nur damit du den Unterschied verstehst, ein Frame beziehst sich auf die Anzahl der Bilder pro Sekunde die auf dem Monitor gezeichnet werden. Das ist der Job deiner Grafikkarte sofern die CPU hinterher kommt deine GPU mit Informationen zu versorgen.


    Der Tick ist quasi die Hintergrund Berechnung also dass was die CPU tut bevor diese Informationen der GPU mitgeteilt werden und bevor diese Informationen als Drawcall an deine GPU gesendet werden.


    Daher dürfte dein Problem wohl eher die CPU sein bzw wie im anderen Thread schon deine Drawcalls bzw die Anzahl deiner Objekte.


    Wie gesagt, das ist zu sagen ohne dein Projekt zu kennen. Hau doch mal 50% deiner Objekte (Testweise) raus. Dann hast du weniger sicherlich weniger Drawcalls und weniger Ticks.

  • Kommt drauf an, was an den Ticks dranhängt

    HP-Anzeigen und Namen die sich zum Spieler drehen. Hab es mit einer variable gesperrt, sodass es nur ausgeführt wird, wenn ich in der Nähe bin.

    Das verbessert nicht meine Performance. Wenn ein Tick beim Branch endet, zieht das auch Leistung?

    Dann eine frage zu "Set Actor Tick Enabled". Wenn ich im Eventgraph keine "Eventtick" drin habe wird das trotzdem ausgeführt, sodass ich "Set Actor Tick Enabled" benötige um es zu deaktivieren?

    Hilft das vllt weiter?:



    Den ich finde keine Lösungsansätze, wie ich meine Performance verbessern kann.



    • Offizieller Beitrag

    Was ich erstmal machen werde ist, alle losen Meshes zu einem Mesh zu verbinden, da jedes aus aus vielen Einzelteilen besteht.

    Dadurch wird dein Drawcall weniger und deine Performance sollte auch besser werden.


    Wie viele Meshes hast du den in einem Frame im Worstcase ?


    Worstcase wäre zb du stehst auf einem Berg und schaust auf einen Wald mit 1000 Bäume die jeweils eigene Meshes sind. Das wären dann allein 1000 Drawcalls. Wobei Folliage performanter sind als als normale Meshes.


    Deswegen ist es ein Unterschied ob du Pflanzen als Foliage oder als Mesh verwendest.

  • Tut es leider nicht, den ich habe alle Häuser und Brücken zu einzelnen Meshes gemacht und meine FPS ist uneverändert. Kann einfach die Ursache nicht finden.

    und zu den drawcalls:




    Wenn ich vom Berg gucke dann:


  • Wie wie viele Materials verwendest du wie wie groß sind die ?


    Versuch doch mal die Meshs ab einer bestimmten Distanz auszublenden. zb über das Distance Culling.

    Wie kann ich das prüfen wieviel Materials ich nutze? Die Größe ist immer 2k
    ich habe mit "ShowFlag.StaticMeshes 0" alle meshes ausgeblendet, da gewinne ich höstens 1 FPS...

    • Offizieller Beitrag

    Dann sind deine Meshes wohl tatsächlich nicht das Problem.


    DU kannst ja mit und den Zahlen auf der Tastatur zwischen verschiedenen Darstellungsarten durchwechseln.

    Mit Alt+8 kannst du dir die ShaderComplexity anzeigen lassen. Deine Shader sollten bestensfalls grün sein. Rot bedeutet sehr kostspielig.


    Verwendest du auch LODs für deine Texturen ?

    Wenn deine Grafikkarte in einiger Entfernung eine 2k Textur zeichnen muss, dann ist das nicht gerade performant ^^

    Deswegen solltest für Texturen auch LODs verwenden.

    Am besten Mesh + Texture LODs


    Wenn du direkt vor einer Wand stehst, die eine 2k Textur hat dann kann die Engine auch wirklich fast 2048² Pixel zeichnen. Befindet sich deine Wand aber in 30 Meter Entfernung. ist deine Wand auf dem Monitor nur noch weniger CM groß.

    Die Engine müsste dann theoretisch eine 2 Meter Textur auf deine Fläche von vielleicht 3 CM zeichen. Das geht natürlich nicht, also muss die Engine die Textur runterrechnen.

    Wenn du ganz viele 2K Texturen hast, dann muss die Engine dass in jedem Frame mit jeder Textur machen die im Frustum sichtbar sind. (Frustum ist dein Sichtbereich)


    Die Engine macht es sich einfacher wenn weit entfernte Texturen eine deutlich geringere Auflösung haben. In einigen AAA spielen werden hier auch pixelmatsch Texturen in großer Entfernung verwendet. zb 16 Pixel für einen Strommast in 2k Entfernung statt einer 2k Textur in 2km Entfernung.

  • Ich werde bei den Meshes mittels LOD System die Triangels verringern, aber auch damit die Texturen kleiner?

    Wenn ich die Meshes ausblende mit "ShowFlag.StaticMeshes 0", dann werde auch nicht mehr die Texturen geladen oder?

    Das würde bedeutet das einzige was bleib ist Landscape und die Ursache wäre nicht 2k Texturen in der Entfernung.
    (Mach ich aber trotzdem den ich will nach und nach alles optimieren)
    Kann man beim Landscape, das Materials in einem Radius detailliert halten und den Rest nicht?

    Ich habe herausgefunden, dass bei mir die Schmetterlinge und Vögel ein Problem waren. Konnte dadurch 10 fps retten.
    Aber finde es schade, dass ich das nicht durch Unreal Tools entdecken kann, sondern durch löschen von Objekten/Blueprints.

    • Offizieller Beitrag

    Ich werde bei den Meshes mittels LOD System die Triangels verringern, aber auch damit die Texturen kleiner?

    Ja das wissen viele nicht aber LODs werden/können auch andere Texturen eingeblendet werden.

    Jede LOD Stufe, ist ja ein eigenständiges Mesh wo auch extra Materialien, oder extra Texturen verwendet werden können.

    Wenn ich die Meshes ausblende mit "ShowFlag.StaticMeshes 0", dann werde auch nicht mehr die Texturen geladen oder?

    Ausblenden ist etwas anderes wie nicht berechnen. Ich vermute mal dass die dinge trotzdem berechnet werden auch wenn du sie nicht siehst. Das ist ja ein Konsolenbefehl, theoretisch kannst du den auch ingame ausführen über die Node Execute Console Command. Wenn du das Ingame machst, müsste ja dann alles nachberechnet werden. Deswegen glaube ich, das auch wenn du das deaktiviert hast es trotzdem berechnet wird. Das würde auch erklären warum sich an der Performance nichts ändert.


    Vielleicht kannst dass irgend wie nachlesen oder ausprobieren ? Ich weiß es ehrlich gesagt auch nicht.


    dass ich das nicht durch Unreal Tools entdecken kann, sondern durch löschen von Objekten/Blueprints.

    Das spielt doch erstmal keine Rolle. Du musst rausfinden was die Ursache ist, danach kann kannst du dir überlegen was du dagegen tun kannst.

    Mach einfach ein Backup bevor du irgend etwas löscht.

    Wenn Schmetterlinge hast, die 10 FPS ziehen, hast du auf jedenfalls noch mehr dinge die Performance ziehen. Das geht halt nur duch ausprobieren.