framerate-unabhängige GameLoop

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: meine derzeitige GameLoop

Beitrag von AND51 »

ZeHa hat geschrieben:Vielleicht noch ein simples Beispiel: Einkaufen
Oh, geht das schnell hier^^

Ich verweise hierzu nochmal auf meinen Hinweis, dass es davon abhängt, ob ich "Lets go Shopping 1.0" oder "Crysis XII" programmiere! Klar werden die meisten Spiele klein im Umfang bleiben, sodass Threading kaum lohnt. Aber wer richtig was vorhat, der mag mit Threading gut beraten sein. Wie gesagt, es hängt davon ab, wie gut man Programmieren kann und was für ein Spiel ich mir zum Ziel gesetzt habe.

Ich habe das Gefühl auf dieses Argument gehst du (un?)bewusst nicht ein, denn du wählst hier absichtlich ein Beispiel bei dem Threading ganz klar nicht lohnt. Ich weiß nicht, ob wir uns missverstehen? Du hast deine "derzeitige GameLoop" vorgestellt, ich stelle in diesem Topic (siehe Titel) "meine derzeitige GameLoop" vor. Soll ja nur eine Inspiration für andere sein, die hier lesen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: meine derzeitige GameLoop

Beitrag von ts-soft »

ZeHa hat geschrieben: - Einkaufszettel schreiben
- zum Supermarkt laufen
- Sachen aus dem Regal nehmen
- an der Kasse bezahlen
- nach Hause gehen
Multithreaded würde das wahrscheinlich so ablaufen:
Ich schreibe den Einkaufszettel während ich zum Supermarkt laufe und gebe diesen an der Kasse ab,
während ich die Sachen aus dem Regal nehme, zu Hause stelle ich fest, nicht bezahlt zu haben, da klingelt
bereits die Kasse an der Haustür, die ich aber aufgrund der lauten Musik nicht höre :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Rüge

Beitrag von AND51 »

Tschuldigung, aber hier werde ich leicht böse. Ich habe, wie der Threadersteller es wünschte, meine Sichtweise dargelegt. Ich habe nicht gesagt, dass es das einzig Wahre ist. Vielleicht ist auch meine Lösung nicht die beste, wer weiß das schon.


Ich werde hier scheinbar nicht nur niedergestampft, sondern es wird sich auch noch über mich lustig gemacht. Nicht wahr, TS-Soft? Was soll das? Hast du nichts besseres zu tun? Da hab ich kein Bock mehr, mitzumachen, sorry. Und jetzt kann ich all diejenigen nachvollziehen, denen das auch auf den Sack ging und die dann gegangen sind. Hauptsache, dein Posting-Zähler ist um eins nach oben gegangen oder wie? Oder hast du irgend ein ausgefallenes Geltungsbedürfnis?



So, ich komm jetzt wieder runter. Und ich bin bereit, das hier zu vergessen, wenn ein Mod den Thread ab deinem jetzigen Beitrag abschneidet.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: meine derzeitige GameLoop

Beitrag von ts-soft »

@AND51
Wenn Du den Spaß nicht verstehst, den grünen Smiley nicht siehst und sowieso nicht direkt angesprochen
wurdest, verstehe ich Dein Leberwurstspiel hier überhaupt nicht.

Dann setz Dich doch in die Ecke und heul, ich muß das nicht verstehen :freak:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: meine derzeitige GameLoop

Beitrag von PMV »

Es soll halt Leute geben, die bleiben mit der Zeit stehen :mrgreen:

Bis einschließlich DirectX10 gibt es keine Multithread-Unterstützung.
Ab DX11 sieht das aber anders aus. So ist es nicht nur Möglich die
Grafik in einen, sondern gleich in mehrere Threads zu verfrachten.
Und was bringt das geilste Spiel, wenn es zwar 4 Kerne zur Auswahl hat,
aber nur einen Auslastet ... und dabei noch ruckelt? :wink: Ich hab solche
Exemplare hier. Fortschritt gibt es heute nur noch durch Threads. Da
ist der Vergleich mit dem Einkaufszettel nicht mehr Zeitgemäß. Da passt
eher das Lebensmittel-Bestellen im Internet. Lieferung und Bezahlvorgang
ginge Zeitgleich und wer weis, was man da alles in der Zeit machen kann.
Lediglich das Zusammen klicken passiert nach wie vor nach dem Überlegen,
was man denn braucht. Dafür kann man aber in kurzer Zeit bei mehreren
Läden "einkaufen". Man kann vielleicht nicht alles in Threads auspacken,
aber AND51 liegt da sicher garnicht so verkehrt. Der Aufwand ist natürlich
sehr hoch, um alles so zu splitten, aber es sind unabhängige Aktivitäten.

Die Grafik muss nicht warten, bis die Logik ein mal durchlaufen ist. Genau
so muss die Logik nicht warten, bis der Screen ein mal gezeichnet ist.
Das was man sieht, sind so wie so nur Momentaufnahmen. Und wenn
nun Objekt 20 noch ein Pixel früher hätte gezeichnet werden müssen
oder Objekt 2.344 ein Pixel weiter ist ... das nimmt das Auge eh nicht wahr.
Wohl aber, das es alles schön flüssig läuft. :wink:

Auch sind Eingaben des Spielers udn auch Netzwerkaktivitäten Nebensächlich-
keiten, die bei vielen Spielen nicht fest verankert sein müssen. Das zu
realisieren ist aber natürlich nicht in ein paar Zeilen gemacht wie
es für DOS-Spiele der Fall war. :wink: Und für einen einzellnen Hobby-
Entwickler ist es erst recht ein riesen Berg, den man da bewältigen müsste.
Da geht die Kosten-Nutzen-Rechnung selten auf, das stimmt schon.

Und das Beantwortet sicher auch AND51 Startfrage in seinem Post.
Der Aufwand dafür ist immens hoch. Und wenn man eh nur ein kleines
Männchen hat, das von A nach B hüpft in einer bescheidenen 2D-Welt,
da ist es schlicht quatsch, diesen Aufwand zu betreiben.

Es gab übrigends auch mal so einen Thread bezüglich der Parallelisierung.
Ich vermute aber, das war im englischen Forum und ist auch schon lange
her.

Wie auch immer ... ich hab mein Spiel auch erst mal ohne Threads realisiert.
Auf meiner ToDo-Liste ist das Auslager des Grafikloops aber bereits für
die nahe Zukunft angesetzt. Die Grafikverwaltung in einen extra Thread aus
zu lagern wird aber sicher nicht so einfach, wie ich es gerne hätte. Doch
so können die Positionen der Spielobjekte berechnet werden, selbst wenn die
Grafikkarte mal überfordert ist, außerdem will ich nicht auf 60 FPS beschränkt
sein und auch nicht rücksicht darauf nehmen müssen, dass die Logik tatsächlich
diese Geschwindigkeit haben muss. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: meine derzeitige GameLoop

Beitrag von STARGÅTE »

Um auf den ersten Beitrag mal einzugehen:

Genau zu dem Problem von "sich durchdringene Objekte bei zu schnellen Veränderungen" schreibe ich gerade ein Tutorial:

Hier mal ein Eindruck: Berechnung der zweidimensionalen Mechanik für Systeme mit wenigen dynamischen Objekten [PDF]
(sehr mathematisch aufgebaut)

Dort beschreibe ich, wie man eine exakte Vorhersage für den nächsten Zeitlichen Zustand von Systemen machen kann.

Ehrlich wie du schon beschreibe hast, wird für jeden Frame eine Berechnung gestatet, welche Objekte mit welchen innerhalb dieser zeit kollidieren und das System dadurch ändern.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Re: meine derzeitige GameLoop

Beitrag von ZeHa »

LOL was geht denn ab... das Beispiel von ts-soft ist voll witzig :mrgreen: und sollte glaub nicht wirklich konstruktives zum Thema beitragen ;)

Und daß ich "(un)bewußt" auf irgendwas nicht eingehe, stimmt nicht. Ich rede jetzt nur von "Spieleprogrammierung", und da ist es nunmal so wie ich es sage - hauptsächlich sequentiell. Ich beschäftige mich schon lange damit und habe bisher noch nie wirklich etwas anderes gehört. Im Gegenteil, ich habe mir auch schon mal (ernsthaft) Gedanken zu Multithreading bei Spielen gemacht, und letztendlich bin ich zu dem Schluß gekommen (auch im Gespräch mit einem, der wirklich Ahnung von dem Zeug hat), daß das letztendlich nichts bringt.

Es geht auch nicht drum, ob einer viel Ahnung von Threads hat oder nicht - natürlich sollte man sich damit auskennen, wenn man sie benutzt, aber selbst erfahrene Programmierer hauen da manchmal Fehler rein, die erst nach langer Zeit auftreten können (und das möglicherweise erst beim Kunden). Daher sagte ich auch, wenn es sich vermeiden läßt, sollte man auf Threads verzichten. Denn einige neigen leider dazu, alles mit Threads lösen zu wollen (und damit meine ich jetzt nicht speziell Dich), ohne wirklich zu wissen, ob es letztendlich überhaupt Vorteile bietet. Gibt da auch einen coolen Spruch: "If you've got a shiny new hammer, every problem looks like a nail" :mrgreen:
Du hast deine "derzeitige GameLoop" vorgestellt, ich stelle in diesem Topic (siehe Titel) "meine derzeitige GameLoop" vor.
Ohne Dich jetzt persönlich angreifen zu wollen, aber meine "derzeitige GameLoop" wurde schon ein paar Mal implementiert (auch von 'nem Kumpel, der sie dann letztendlich noch mit mir etwas verfeinert hat) und sie verrichtet zuverlässig ihren Dienst. Deine "derzeitige GameLoop" ist im Moment jedoch erstmal eine Überlegung. Nicht weiter schlimm, aber diese Überlegungen hatte ich wie gesagt auch schon und wie oben bereits beschrieben, habe ich sie dann aber auch bald wieder verworfen.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Re: meine derzeitige GameLoop

Beitrag von ZeHa »

STARGÅTE hat geschrieben:Ehrlich wie du schon beschreibe hast, wird für jeden Frame eine Berechnung gestatet, welche Objekte mit welchen innerhalb dieser zeit kollidieren und das System dadurch ändern.
Es gäbe natürlich auch noch die Möglichkeit, bei bewegenden Objekten die "Linie" zwischen der alten und der neuen Position heranzunehmen und zu checken, ob die Linie mit irgendwas kollidiert. Somit müßte man also nicht alle Zwischenschritte zwingend updaten. Allerdings ist die Methode mit den Zwischenschritten irgendwie "simpler" und mir ist gerade auch eingefallen, daß sie sogar noch den Vorteil hat, daß z.B. auch kurvenförmige Bewegungen oder Richtungsänderungen ganz einfach funktionieren (weil sie durch das Nachholen der Updates auf ganz "normale" Art und Weise passieren).
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: meine derzeitige GameLoop

Beitrag von STARGÅTE »

ZeHa hat geschrieben:Es gäbe natürlich auch noch die Möglichkeit, bei bewegenden Objekten die "Linie" zwischen der alten und der neuen Position heranzunehmen und zu checken, ob die Linie mit irgendwas kollidiert. Somit müßte man also nicht alle Zwischenschritte zwingend updaten. Allerdings ist die Methode mit den Zwischenschritten irgendwie "simpler" und mir ist gerade auch eingefallen, daß sie sogar noch den Vorteil hat, daß z.B. auch kurvenförmige Bewegungen oder Richtungsänderungen ganz einfach funktionieren (weil sie durch das Nachholen der Updates auf ganz "normale" Art und Weise passieren).
Aber gerade wenn man wirklich sehr schnelle kleine Obejkte hat (Projektil einer Waffen) ist es "zwingend" notwendig, es als "Linie" zu betrachten.
Rein mathematisch gesehen, wäre auch einen "kurvenförmige Bewegung" vorhersagbar, nur werden halt die Berechnungen komplizierter.
Dass das nutzen von Zwischenschritten einfacher ist, ist keine Frage, es komt halt wirklich darauf an, was man im Endeffekt erreichen will.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Re: meine derzeitige GameLoop

Beitrag von ZeHa »

PMV hat geschrieben:Bis einschließlich DirectX10 gibt es keine Multithread-Unterstützung.
Ab DX11 sieht das aber anders aus. So ist es nicht nur Möglich die
Grafik in einen, sondern gleich in mehrere Threads zu verfrachten.
Das ist aber was völlig anderes - sag mir Bescheid falls ich mich irre, aber meinst Du nicht einfach nur die Parallelisierung der Grafik-Prozessoren? Damit läßt sich eine Szene natürlich deutlich schneller rendern, aber das bedeutet trotzdem nicht, daß der gesamte Rendervorgang völlig neben dem eigentlichen Spiel her laufen kann. Sondern einfach nur, daß halt 4 Männer den Zaun streichen statt nur einem einzigen ;) aber trotzdem muß der Rest warten, bis die fertig sind.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Antworten