Mein Spiel ruckelt :(
Verfasst: 28.03.2022, 23:01
Ja, ok, so schlimm ist es nicht.
Aber ich hab die letzten Jahre primär auf meinem Desktop entwickelt, und der hat halt ganz ok'e Hardware. Jetzt wollte ich von Unterwegs mit dem Laptop was daran machen (GTX 860M, i5-4210H) und es startet zwar, läuft aber recht zäh. Ältere kommerzielle Spiele mit 'vergleichbarer' Grafik laufen deutlich besser als mein eigenes, aber ok ich habe auch eher neue Features eingebaut als alte zu optimiere deshalb war das irgendwie zu erwarten. Trotzdem unschön.
Mein erster Test war es, beim Laden alle Texturen zu verkleinern. Das kann man schnell einbauen und schnell messen, aber offensichtlich war das nicht der größte Bottleneck, es wurde kaum schneller. Was sollte ich also als nächstes probieren?
Soweit ich weiß, ist ja das erste Problem, dass GPU und CPU parallel arbeiten, Draw-Calls blockieren also nicht, erst am Ende des Frames muss alles synchron sein, d.h. mit "Szene hundertmal rendern und Zeiten mitteln" kann ich recht präzise Zeiten für einen ganzen Frame berechnen, aber was jetzt innerhalb eines Frames wie lange dauert ist erstmal etwas schwieriger zu bestimmen. Das macht klassische Profiler, die die Zeiten von Funktionsaufrufen messen, schwieriger anzuwenden. Nun zu meinen Überlegungen, was ich prinzipiell angehen sollte:
- Hoher Speicherverbrauch / Bandbreitenlimitiert: Alle Texturen verkleinern und vergleichen.
- Alle Meshes durch niedrigere LOD Stufen ersetzen und gucken ob der Triangelcount das Problem ist
- Shader durch simplerer Versionen (ggf. Phong Shading + Colormap) ersetzen um zu gucken ob komplexe Materialien das Problem sind
- Zu viele kleine Draw-Calls, zu viele State-Changes. Engine komplett umschreiben und gucken ob es das schneller macht.
- Irgendwas cleveres mit nSight machen um Insights zu bekommen?
Mein Problem ist so ein bisschen, dass ich mir nicht sicher bin, wie sehr ich will, dass alles noch auf meinem Jahrealten Laptop läuft. Einerseits wäre das schon sehr nett und irgendwie eine gute Art, Mindestanforderungen zu definieren. Andererseits will ich aber jetzt auch echt irgendwie nicht ein halbes Jahr lang nur das Rendern optimieren, bis es dann irgendwie gut genug ist.
Für Mesh-LODs hab ich grad keinen Code, alle Objekte auf simplere Materialien umstellen wäre aber innerhalb eines Tages machbar. Ich befürchte aber, dass ich eher zu schlechte Draw-Calls mit zu vielen State-Changes habe, bloß würde das halt wirklich viel Umstellung bedeuten und man müsste einige Tage werkeln bis man überhaupt weiß, ob es was gebracht hat. Meh. Deshalb meine Frage: Habt ihr irgendwelche cleveren Ideen, was ich unbedingt als erstes ausprobieren sollte?
Aber ich hab die letzten Jahre primär auf meinem Desktop entwickelt, und der hat halt ganz ok'e Hardware. Jetzt wollte ich von Unterwegs mit dem Laptop was daran machen (GTX 860M, i5-4210H) und es startet zwar, läuft aber recht zäh. Ältere kommerzielle Spiele mit 'vergleichbarer' Grafik laufen deutlich besser als mein eigenes, aber ok ich habe auch eher neue Features eingebaut als alte zu optimiere deshalb war das irgendwie zu erwarten. Trotzdem unschön.
Mein erster Test war es, beim Laden alle Texturen zu verkleinern. Das kann man schnell einbauen und schnell messen, aber offensichtlich war das nicht der größte Bottleneck, es wurde kaum schneller. Was sollte ich also als nächstes probieren?
Soweit ich weiß, ist ja das erste Problem, dass GPU und CPU parallel arbeiten, Draw-Calls blockieren also nicht, erst am Ende des Frames muss alles synchron sein, d.h. mit "Szene hundertmal rendern und Zeiten mitteln" kann ich recht präzise Zeiten für einen ganzen Frame berechnen, aber was jetzt innerhalb eines Frames wie lange dauert ist erstmal etwas schwieriger zu bestimmen. Das macht klassische Profiler, die die Zeiten von Funktionsaufrufen messen, schwieriger anzuwenden. Nun zu meinen Überlegungen, was ich prinzipiell angehen sollte:
- Hoher Speicherverbrauch / Bandbreitenlimitiert: Alle Texturen verkleinern und vergleichen.
- Alle Meshes durch niedrigere LOD Stufen ersetzen und gucken ob der Triangelcount das Problem ist
- Shader durch simplerer Versionen (ggf. Phong Shading + Colormap) ersetzen um zu gucken ob komplexe Materialien das Problem sind
- Zu viele kleine Draw-Calls, zu viele State-Changes. Engine komplett umschreiben und gucken ob es das schneller macht.
- Irgendwas cleveres mit nSight machen um Insights zu bekommen?
Mein Problem ist so ein bisschen, dass ich mir nicht sicher bin, wie sehr ich will, dass alles noch auf meinem Jahrealten Laptop läuft. Einerseits wäre das schon sehr nett und irgendwie eine gute Art, Mindestanforderungen zu definieren. Andererseits will ich aber jetzt auch echt irgendwie nicht ein halbes Jahr lang nur das Rendern optimieren, bis es dann irgendwie gut genug ist.
Für Mesh-LODs hab ich grad keinen Code, alle Objekte auf simplere Materialien umstellen wäre aber innerhalb eines Tages machbar. Ich befürchte aber, dass ich eher zu schlechte Draw-Calls mit zu vielen State-Changes habe, bloß würde das halt wirklich viel Umstellung bedeuten und man müsste einige Tage werkeln bis man überhaupt weiß, ob es was gebracht hat. Meh. Deshalb meine Frage: Habt ihr irgendwelche cleveren Ideen, was ich unbedingt als erstes ausprobieren sollte?