Optimierung ist wieder mal so ein Thema zu dem ich ein ganzes Buch schreiben könnte - aber wie immer belasse ich es mal mit ein paar Tips und Denkanstössen. Von daher mal locker flockig runtergeschrieben was man sich so überlegen sollte wenn man merkt das Spiel läuft etwas zu lahm.
1. Zielplattform definieren.
Wenn ihr ein Puzzlespiel für Android oder IOS (iPhone) Plattformen macht dann sollte das nach Möglichkeit auf jeder noch so alten Gurke laufen. Klar euer iPhone 11 oder Samsung Galaxy Note 9 sind hip aber schaut mal wie viele Leute noch mit einem iPhone 6 rumlaufen. Unterstützt ihr mehr Modelle habt ihr mehr potentielle Käufer. End of Story. Macht ihr dagegen ein VR Spiel für HTC Vive und co dann braucht ihr realistisch nicht damit rechnen daß jemand unter ner Geforce GTX 970 sowas überhaupt probiert zu starten. Von daher macht euch erst mal realistisch Gedanken was die Mindestanforderungen sind und wieviel FPS ihr für das Minimum Rig bieten wollt. Beim PC hat man den Luxus man kann die Auflösung und Scalability settings runterdrehen kann - dann läuft es auf einmal auf ner Steinzeit Grafikkarte wie ner Geforce GT 540 einwandfrei - sieht aber bescheiden aus. Eure überlegungen sollten also schon voraussetzen was die Mindestanforderung für "epic" scalability ist (Ihr kennt "Epic" als beste Einstellung im Editor).
2. Echte Tests.
Klar wenn es im Editor gut läuft läuft es kompiliert in der regel noch besser. Aber unabdingbar ist messen statt schätzen. "Stat FPS" und "Stat unit" sind klassische Konsolenbefehle mit denen ihr FPS/Leistung objektiv messen könnt. Kann man mit nem console command node auch auf nen key legen oder automatisch starten. Latscht mal durch eure levels und schaut auf die FPS. Wenn ihr durrchgehend 60 fps wollt ist es unbedenklich wenn die in der kompilierten version auf der Minimum Hardware mal auf 58 droppen, aber wenn ihr mal auf 5 fps kommt müsst ihr euch schon was überlegen.
3. Echtes Optimieren
Ja klar - die FPS reichen nicht - das ganze läuft wie ein Sack Muscheln auf meiner Ziel-Hardware, ich muss optimieren. Wichtig ist es erst mal rauszufinden was das ganze so lahm macht. Was kostet viel GPU/CPU/Memory und wo ziehe ich die Schrauben an. Mal ganz dumm gesprochen - wenn das Problem an euren game ist daß ihr im level BP Tick jedes Frame die Zahl Pi auf 100 Stellen hinter dem Komma ausrechnet nützt es euch nix an den 3D Modellen oder Texturen zu schrauben. Von daher ist es gut in etwa zu wissen was die meiste Performance zieht. Dazu kommen wir in den nächsten Abschnitten.
4. UE4 Profiler
Ganz gemein daß ich dieses Unwort hier raushaue. Die meisten Hobby Programmierer wissen nicht mal was der Profiler ist. Und die anderen meiden ihn meist wie der Teufel das Weihwasser. Nicht ganz zu unrecht - denn er ist kompliziert und es kostet viel Zeit sich damit auseinanderzusetzen. Aber der UE4 Profiler ist ein extrem professionelles Tool um zu messen was in eurem game wie viel Ressourcen verbrät. ABer auch wenn ihr euch nicht viel mit dem Profiler auseinandersetzt und ihn nur mallaufen lässt ist er schon sehr wertvoll durch die Kennzahlen CPU und GPU. Verbrätder Render thread bei euch 99% - dann Gratulation - es ist wirklich nur die Grafik. Ihr habt was Event tick ud co angeht nix dummes gemacht. Gibt esneben dem Render thread aber noch andere "Fresser", dann müsste man sich die eigentlich programmierung ansehen. Habt ihr einen "On Tick" überladen? Nutzt ihr zu viele "get all actors..." Abfragen? Oder zu komplizierte Schleifen?
5. Render thread - oder: Hilfe die Grafikkarte glüht
Das ist wohl meist das Problem. Ja klar ein 3D Spiel nutzt die 3D Karte schon. Aber oft gibt es hier was zu optimieren. Hier gibt der Viewport schnelle Hilfe. Standard ist die Ansicht "Lit" im viewport - verwendet mal "Optimization Viewmodes". Interessant sind hier "light Complexity" und "Shader Complexity", was euch einen Überblick gibt wo Lichter und wo Materialien sehr teuer zu errechnen sind.
6. Materialien - muß man alles haben?
Das UE4 default Material ist sehr genügsam. Transparente und reflektierende Materialen dagegen kosten mehr. Könnt ihr in eurem 4K Monitor die Material nodes nicht auf einer Seite darstellen dann ist das ein zeichen für ein recht komplexes Material. Wie zuvor erwähnt - Shader Complexity gibt euch da gute Anhaltspunkte. Ist hier alles Rot sind Materialien komplex zu berechnen. Nicht nur der Transparenz Modus ist ausschlaggebend - könnt ihr auch mal roughness auf 1 stellen? Muß es reflektieren? Das kostet viel GPU. Dann gibt es noch Texturen. also zum nächsten Punkt.
7. Texturen - muß es 4K sein?
Klar wenn eine riesige Wand eine Textur ist dann macht das auch mal Sinn die in 4K zu haben. ABer muß eine Streichholzschachtel oder die Seite eines Würfels 4K haben? Hier muß man mal überlegen a la "Wenn der User eine 4K AUflösung hat (Selten!) und sich dann eine Seite des Würfels anschaut - dann müsste sie schon den ganzen Bildschirm füllen damit er immer noch eine perfekte nicht downscaled textur sieht". Jetzt die Quizfrage - wird er jemals an den Würfel so extrem nahe kommen daß eine Seite den ganzen Bildschirm füllt? Wenn nein dann ist das ein Kandidat um die textur extrem zu verkleinern. Ihr haut euch nur den texture streaming pool unnötig voll wenn ihr alle mini Objekte mit 4K texturen ausstattet. Überlegt mal wie nah man den kommt und es ist manchmal gar nicht so schlimm wenn mal ne 4K textur auf einem 8K Screen in fullscreen erscheint. meist sitzt man eh nicht so nah davor und das Anti-Aliasing macht es sehr viel schöner. Mal reduzieren und probieren.
8. LOD oder wie ich aus 10 millionen Polygonen 10.000 machte
UE4 macht auto-LOD. Dumm nur wenn eure Modelle gar keine LODs haben. LOD heisst "Level of Detail". Sprich je weiter weg die Objekte desto weniger detailliert. Gibt geile Plugins wie "InstaLOD", mit denen man sehr komplexe Modelle in den höheren LODs stark reduzieren kann. Nutzt das wenn Polygone der Killer sind.
Manche Modelle die eh nur aus Entfernung sichtbar sind kann man grundsätzlich downscalen, also mal probieren.
So ich bin erst mal platt vom Schreiben. Vielleicht erweiter ich das bei zeiten.