Hallo Leute,
bei bisherigen Projekten mit der SFML habe ich als GameLoop immer die im
"Getting Started" Tutorial gezeigte GameLoop verwendet.
Diese habe ich dann noch um eine update Funktion erweitert, damit vereinfacht gesagt, das heraus kam:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
float frametime = gameClock.restart().asSeconds();
game.update(frametime);
game.render();
window.display();
}
|
Dabei hat "game.update()" alle spiellogischen Komponenten übernommen (zB Bewegung, Eingabeverarbeitung, KI etc) und die "game.render()" hat danach alles gezeichnet.
Hat soweit auch immer alles gut funktioniert.
Da ich jetzt ein neues Projekt starten wollte und schon länger nichts mehr mit SFML gemacht habe, bin ich erst einmal im Internet auf die Suche gegangen, was denn verbreitete GameLoops sind, um es diesmal "besser" bzw "richtig" zu machen.
Demnach habe ich nun die GameLoop so umgeschrieben, dass die Update-Funktion eine konstante und die Render-Funktion eine "dynamische" Framerate hat:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
gameLogicTimeWaited = 0.0f;
gameLogicUpdateTime = 1.0f/60.0f;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
float frametime = gameClock.restart().asSeconds();
gameLogicTimeWaited += frametime;
if (gameLogicTimeWaited >= gameLogicUpdateTime)
{
update(); //frametime muss nicht übergeben werden, da diese konstant ist
gameLogicTimeWaited -= gameLogicUpdateTime;
}
render();
window.display();
}
|
Inwiefern macht das Sinn?
Eine andere Idee wäre noch, die Update- und Render-Funktionen zu parallelisieren. Aber ich habe das Gefühl, dass durch diese unterschiedlichen Framerates es eventuell später Probleme geben könnte die bei einer gleichen Framerate nicht auftreten.
Was spricht für welches Konzept der GameLoop und habe ich eventuell noch irgendetwas gar nicht gefunden bzw bemerkt?
Wie wichtig ist das Ganze im Endeffekt?
Habt ihr schon irgendwelche (positiven/negativen) Erfahrungen mit dem ein oder anderen Konzept gemacht?
Mit freundlichen Grüßen
poorsider