Du bist nicht angemeldet.

Werbeanzeige

1

13.02.2021, 20:33

Fragen zur Programmierung

Hallo zusammen :)

Ich möchte mein erstes "richtiges" Computerspiel programmieren (2D mit C++) und habe mir dafür ein Buch über Spieleprogrammierung mit SFML2.0 besorgt. Sind alle Spiele die Maps haben die so groß sind das sie niemals vollständig angezeigt werden Open-World Games? Also auch Super-Mario?

Ich habe mir den Ablauf so vorgestellt: Die Maps bestehen aus 2D-Objekten (eigenes Textformat) für dessen Variablen ich ein struct erstelle. Mit List<> kann ich dann beliebig viele Objekte erstellen lassen oder auch wieder löschen.

Nun habe ich ja einen GameLoop und dachte mir das bei jedem Durchlauf auch alle 2D-Objekte abgeklappert werden, und das nur die gezeichnet werden/sich der Physik unterlaufen - die im Blickfeld sind.

Ich frage mich aber ob das der richtige Weg ist bzw finde keinen Anderen. Wenn man sich nun ein modernes 3D-Spiel vorstellt erscheint es mir unmöglich das der Computer pro GameLoop alle Objekte abklappern kann und noch eine schnelle FPS-Zahl liefert.

Dann bleiben auch noch die Fragen ob ich die Logik generell bei Spielen mit der max. Leistung durchlaufen lassen soll und nur der Grafikausgabe eine max. FPS-Zahl unterlegen? Und gibt es Variablen die ich auf static definieren sollte? Ich hatte mal früher Spiele gehackt und erinnere mich noch das die meisten Variablen statisch waren und man die leichter berechnen konnte.

Vielen Dank. :thumbup:

2

13.02.2021, 21:16

Hallo zusammen :)

Ich möchte mein erstes "richtiges" Computerspiel programmieren (2D mit C++) und habe mir dafür ein Buch über Spieleprogrammierung mit SFML2.0 besorgt.


Was spricht denn dagegen mit dem Buch weiter zu arbeiten? Die meisten deiner Fragen werden sich da mit sicherheit schon einmal ein bisschen klären.

3

14.02.2021, 03:58

RE: Fragen zur Programmierung

Sind alle Spiele die Maps haben die so groß sind das sie niemals vollständig angezeigt werden Open-World Games? Also auch Super-Mario?

Nein. Bei "Open-World" geht es weniger darum, was angezeigt wird oder nicht, sondern die möglichen Wege, die der Spieler zur Verfügung hat. Man könnte es auch mit "offenem Terrain" übersetzen. Je mehr der Spieler also in seinem Weg vorgegeben ist, desto weniger spricht man von Open World. Also ist auch Super-Mario kein Open-World-Game, weil die Wege in der Anzahl und Richtung stark vorgegeben sind. Es gibt aber sicherlich auch 2D-Spiele, die eine offene Welt haben können. Wenn Spiele zwar grundsätzlich offen sind, aber durch natürliche Barrieren (Schluchten etc) die Wege auch zu sehr vorgeben und deswegen die offene Welt zu sehr in Bahnen lenkt, kann man gegebenenfalls auch von einer Semi-Open-World reden (quasi der Graubereich, bei dem man nicht so recht weiß ob oder ob nicht).

Zitat

Ich frage mich aber ob das der richtige Weg ist bzw finde keinen Anderen. Wenn man sich nun ein modernes 3D-Spiel vorstellt erscheint es mir unmöglich das der Computer pro GameLoop alle Objekte abklappern kann und noch eine schnelle FPS-Zahl liefert.

Ein modernes 3D-Spiel unterliegt vielen Optimierungen. Es wird an allen Ecken und Enden versucht Leistung durch intelligente Ressourcenausnutzung zu sparen. Die Grafikkarte ist extrem gut darin Dinge parallel zu berechnen. Sie ist wesentlich leistungsfähiger als du denkst.

Ein Problem sind aber Flaschenhälse ... Prozesse, die viel Zeit in Anspruch nehmen. Um ein Objekt aufzurufen, muss die Grafikkarte mit anderen Hardwarekomponenten des PCs kommunizieren, was ein solcher Flaschenhals ist. Die sogenannten "Drawcalls" führen dazu, dass ein PC nach 30.000 Objekten (Beispielwert, natürlich je nach Hardware unterschiedlich) so langsam an die Grenzen kommt und die FPS stark einbrechen. Mit "Instancing", das für mehrere gleiche Objekte mit unterschiedlicher Größe, Drehung und Position nur einen Drawcall benötigt, kann man deutlich mehr Objekte ins Spiel bringen. Dadurch sind auch mit gleicher Hardware auch über 100.000 Objekte möglich.

Eine andere Möglichkeit ist z.B. anstelle von sehr komplexen Modellen (z.B. Pflasterstraßen mit echten Profil) oder ausmodellierten Pflanzen (Gräser, Blattwerk von Bäumen etc) Shader zu benutzen, die durch verschiedene Techniken ein annähernd ähnliches Ergebnis erzielen können, aber viel weniger Berechnungsleistung benötigen.

Es gibt noch viel weitere Optimierungsmöglichkeiten. Es macht an der Stelle wenig Sinn auf alle einzugehen, die wirst du mit der Zeit auch selbst herausfinden können. Das hier sollte nur im Ansatz zeigen, dass durch Optimierungen sehr viel mehr Leistung zur Verfügung stehen kann. Und ja, du hast mit deiner Annahme recht. Ein modernes 3D-Spiel kann unmöglich alles in einem Gameloop abklappern, wenn es diese Optimierungen nicht gäbe, bzw man hätte keine derart hohen Sichtweiten, wie sie heutzutage Standard sind.

Zitat

Dann bleiben auch noch die Fragen ob ich die Logik generell bei Spielen mit der max. Leistung durchlaufen lassen soll und nur der Grafikausgabe eine max. FPS-Zahl unterlegen?

Es macht eigentlich keinen Sinn die Logik schneller durchlaufen zu lassen als die Grafikausgabe. Im Gegenteil, oft wird die Logik sogar langsamer sein dürfen. In Minecraft wird viel im Optimalfall in 20 Ticks pro Sekunde (also jede Logik in 0,05 Sekunden) durchlaufen, während die Grafikausgabe in der Regel zwischen 30-144FPS liegt. Das ist aber auch wieder eine Optimierungsfrage.

Mit Spieleoptimierung wirst du dich zu gegebener Zeit schon noch beschäftigen. Zu Beginn wirst du aber sicher noch andere Baustellen haben, über die du etwas lernen willst. Es ist aber sicher nicht verkehrt im Hinterkopf zu haben, dass da noch etwas wichtiges kommen wird.

Werbeanzeige