Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.05.2015, 09:49

GameProgrammingPatters (Buch) verstehe den GameLoop nicht!

Hallo Leute!


In meinem Projekt kommt es zZt. zu Diskussionen um unseren GameLoop.
Dementsprechend habe ich mein Buch "GameProgrammingPatterns" noch einmal heraus gekramt.

Beim erneuten durchlesen bin ich entweder dümmer oder klüger geworden :D
Das sollt ihr mir bitte aufzeigen ;)


Es geht um folgenden GameLoop (Sorry bekomme den Pseudocode ausm Buch hier nicht formatiert):

Zitat


double previous = getCurrentTime();
double lag = 0.0;
while(true)
{
double current = getCurrentTime();
double elapsed = current - previous;
previous = current;

lag += elapsed;
processInput();

while(lag >= MS_PER_UPDATE)
{
update();
lag -= MS_PER_UPDATE;
}
render();
}


Was ich an diesem Code nicht verstehe - kann auch daran liegen, dass es relativ früh ist - ist, dass current und previous doch fast den gleichen Wert haben...diese Zuweisung geht doch so arsch schnell. Da ist ja keine große CPU Cycle Arbeit dahinter. Würde previous nach processInput() und Update() erst kommen dann würde das ja sinnvoll sein. Da dann wenigstens ne anständige TimeGap zwischen denen previous und current wäre.
Oder verstehe ich hier was falsch?
Das erste Previous über der while Schleife wird ja nur einmal zugewiesen. Da die While Schleife ja (True) bzw (window.isOpen) ist - kann man mit dem previous dort oben ja in der Schleife garnicht mehr rechnen außer beim ersten Durchlauf.

Bitte um Aufklärung ob ich ein Depp bin ?(




gruß Charlie

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

28.05.2015, 09:57

Um den Code auf das für das Problem wesentliche zu reduzieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
double previous = getCurrentTime();
while(true)
{
    double current = getCurrentTime();
    double elapsed = current - previous;
    previous = current;

    // die Berechnungen
}

Am Anfang eines jeden Schleifendurchlaufs beinhaltet previous den Wert, der beim letzten Durchlauf der Schleife zugewiesen wurde, während current den aktuellen Wert beinhaltet. Die Differenz, die in elapsed gespeichert wird, stellt also die vergangene Zeit dar.
Das heißt: anhand dessen wird die zeitliche Differenz der Frames ermittelt.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

3

28.05.2015, 10:13

Ja guten Morgen habs jetzt gerade auch gerafft und dachte bin schneller als der erste Poster :D Fail sag ich dazu nur ;)


Danke Dir trotzdem :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

30.05.2015, 19:15

Siehe Zeile 8 von Sacaldurs Code.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

30.05.2015, 23:19

Stimmt ist etwas komisch.
Ich mache das so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
timeNow = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();

// bla

timeBefore = timeNow;
timeNow = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
timeDif = timeNow-timeBefore;

if(timeDif < targetFps){
    std::this_thread::sleep_for(std::chrono::milliseconds(targetFps-timeDif));
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

31.05.2015, 07:15

Wieso arbeitet Ihr mit sleep? VSynch ist doch die wesentlich bessere Lösung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

31.05.2015, 08:05

Android und iOS ist tatsächlich ein valides Argument, eben weil's das da nicht gibt. Ich denke allerdings nicht, dass DeKugelschieber darüber redet. Ich denke ebenfalls nicht, dass Falke88 über Smartphones redet, daher sind die Vorschläge aus meiner Sicht sehr unpassend.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige