Wie ist das Konzept der Zeit in Computerspielen umgesetzt?

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Wie ist das Konzept der Zeit in Computerspielen umgesetzt?

Beitrag von Orioner » Sa Feb 26, 2022 7:03 pm

Wie ist das Konzept der Zeit in Computerspielen umgesetzt? In den meisten Spielen verstreicht eine bestimmt Menge Zeit in der, der Spieler Ressourcen bekommt, von A nach B läuft, was auch immer. Fast immer hat man irgendwo eine Zeitanzeige, die mitläuft. Diese wird natürlich in regelmäßigen Abständen aktualisiert, so weit so gut. Aber womit wird sie eigentlich aktualisiert, bzw. synchronisiert? Vielleicht ist das auch die falsche Frage, weil ich das Konzept dahinter nicht verstehe.

Um es konkret zu machen: In einem Bergwerk baue ich Eisen ab. Wie ist denn festgelegt, nach welcher Zeitspanne ich eine Einheit Eisens hinzubekommen habe, oder wieviel Eisen ich nach einer Minute abgebaut habe?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Wie ist das Konzept der Zeit in Computerspielen umgesetzt?

Beitrag von Xin » Sa Feb 26, 2022 8:27 pm

Orioner hat geschrieben:
Sa Feb 26, 2022 7:03 pm
Wie ist das Konzept der Zeit in Computerspielen umgesetzt? In den meisten Spielen verstreicht eine bestimmt Menge Zeit in der, der Spieler Ressourcen bekommt, von A nach B läuft, was auch immer. Fast immer hat man irgendwo eine Zeitanzeige, die mitläuft. Diese wird natürlich in regelmäßigen Abständen aktualisiert, so weit so gut. Aber womit wird sie eigentlich aktualisiert, bzw. synchronisiert? Vielleicht ist das auch die falsche Frage, weil ich das Konzept dahinter nicht verstehe.
Oftmals werden "Runden" in einer Zeiteinheit dargestellt. Stand Runde 5 sagt man halt Tag 5. Fertig.
Jede Runde guckt man sich an, was jedes Objekt produzieren oder verbrauchen kann und wandelt das entsprechend um.
Orioner hat geschrieben:
Sa Feb 26, 2022 7:03 pm
Um es konkret zu machen: In einem Bergwerk baue ich Eisen ab. Wie ist denn festgelegt, nach welcher Zeitspanne ich eine Einheit Eisens hinzubekommen habe, oder wieviel Eisen ich nach einer Minute abgebaut habe?
Gut, also spielen wir eine Runde. Die Runde startet, es wird das Objekt "Bergwerk" durchlaufen. Es sind dem Bergwerk 5 Arbeiter zugeordnet und es gibt 4 Hacken. Und drei Brote, die sich die Arbeiter teilen müssen. Sie arbeiten also auf 3/5facher Leistung, aber nur 4 können Haken. Dem Bergwerk wird in dieser Runde 3 Brote abgezogen, 4 Arbeiter mal 60% Leistungsfähigkeit führt zu 2,4 Eisen. Der Miene werden also 2 Eiseneinheiten abgenommen, dem Lager des Bergwerkes werden also 2 Eisen hinzugefügt. Leider können nur 10 Eisen gelagert werden, das Lager hat aber schon 9 Eisen. Also kann nur 1 Eisen für den Abtransport gelagert werden und das andere Eisen bleibt in der Miene. Damit ist das Objekt bearbeitet und das nächste Objekt kommt dran.

Irgendwie so - wie auch immer Du Deine Spielobjekte definierst.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Wie ist das Konzept der Zeit in Computerspielen umgesetzt?

Beitrag von cloidnerux » Mo Feb 28, 2022 8:50 am

Spiele werden von Menschen gespielt und Menschen haben ein inherentes Verständnis von Zeitspannen. Dies ist zwar stark von der heutigen Zeitmessung abhängig, ist aber trotzdem immer noch basiert auf der Wahrnehmung.
Daher willst du das dein Spiel in einem Maße abläuft, dass es einem Menschen nicht zu schnell vorkommt, aber auch nicht langsam erscheint. Zu schnell ist es, wenn man als Mensch nicht mehr hinterher kommt, daher zu viel passiert. Zu langsam ist es, wenn man als Spieler Zeit hat über andere Dinge nachzudenken und man den Fokus vom Spiel abwendet.

Daher, du synchronisierst alles immer in Abhängigeit von der "realen", bzw Systemzeit. Du definierst alles in Bezug auf reale Sekunden, damit man den Bezug zur echten Welt behält.

Von der Programmierung her gibt es aber einen interessanten Aspekt: Früher zumindest aktualisierte man die Spielwelt in abhängigkeit von der BIldwiederholrate. Daher jedes mal wenn ein neues Bild gerendert wird, wird auch die Spielwelt aktualisiert. Daher der Spieler in abhängigkeit der Eingaben bewegt, Items aktualisiert, etc. Ganz alte Spiele hatten konstante Framerates, daher war auch der Zeitschritt zwischen den BIldern immer gleich. Spahrsame Programmierer haben dann statt eine Synchronisierung einfach nur diesen Zeitschritt genutzt. Dann wurden Computer besser, APIs ändern sich und plötzlich wurden deutlich höhere Framerates erreicht, was zur folge hat das Spiele plötzlich in x-facher Geschwindigkeit laufen.

In den heutigen "riesigen" Spielwelten ist dieser Ansatz, immer alles zu Updaten nicht mehr Tragbar. Da muss man sich schon gedanken machen, wie man alles Asynchron realisiert und wie man die Spielwelt gezielt reduziert um resourcen zu spahren.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Wie ist das Konzept der Zeit in Computerspielen umgesetzt?

Beitrag von Xin » Mo Feb 28, 2022 1:07 pm

Was die Synchronisation zur Framerate angeht... das betrifft ja nur Bewegtgrafik. Also wenn sich eine Spielfigur x Einheiten pro Zeiteinheit weiterbewegt. Also wenn eine Einheit sich um 100 Entfernungseinheiten pro Sekunde bewegt, muss sie entsprechend nach 1 Sekunde 100 Einheiten weiter sein. Auf welche Auflösung 100 Entfernungseinheiten skaliert werden ist dann eine Frage und wo sich die Einheit gerade befindet.

Ich habe dafür ein "FloatingValue" entwickelt, dem ich sage, dass es von x nach y über s Sekunden verläuft. Und dann frage ich halt ab. Ich will jetzt ein Bild rendern, mir ist egal, wie lange das letzte bild gebraucht habe, jetzt ist 0,5 Sekunden nach Beginn der Bewegung. Also y-x*0,5/s und dann bekomme ich den Wert zurück, wo ich mich gerade in der Bewegung befinde.
Den Zeitpunkt frage ich bei Beginn des Renderns ab und benutze ihn für jede Animation, auch wenn durch das rendern vorheriger Objekte wieder Zeit vergangen ist. Relevant ist nur der Zeitpunkt an dem ich das Rendern begonnen habe. Wenn eine Person als 2D-Grafik beispielsweise läuft, ist die Frage, welche 2D-Grafik muss jetzt dargestellt werden, zeitabhängig. Das kann aber auch für animierte 2D-Objekte gelten, wie Häuser, wo der Rauch aus dem Kamin kommt.

Ansonsten ist halt alles eine Liste oder Matrix von Objekten: Das Spielfeld als x/y-Matrix, die mobilen Einheiten, die ihren Renderposition verändern und die immobilen Einheiten, die bei jedem Renderprozess gezeichnet werden müssen, aber auch beispielsweise Dialoge, die über dem Spielfeld gerendert werden.
Während der Spieler auf den Bildschirm klickt und Einfluss nimmt, wird im Hintergrund schon das nächste Bild gerendert.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten