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
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void App::run() { sf::Clock clock; sf::Time tlu = sf::Time::Zero; // Zeit, die Vergangen ist, seit dem letzten Update while (window.isOpen()) { currentState->processEvents(*this, window); window.clear(sf::Color(0, 0, 0)); // In die while-Schliefe geht es, sobald tlu größer ist als die Konstant festgelegte Zeit Pro Frame (TPF) // Der Wert steht zur Zeit bei 1/60 while (tlu > TPF) { tlu -= TPF; currentState->processEvents(*this, window); currentState->update(*this, window, TPF); } currentState->render(window); window.display(); tlu += clock.restart(); } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
void MainMenu::update(App& app, sf::RenderWindow& window, sf::Time delta) { if (shape.getPosition().x < CONST::DISPLAY_WIDTH && left == false) { shape.setPosition(shape.getPosition().x + (speed*delta.asSeconds()), shape.getPosition().y); } ... ... } |
Oder kann es sein das ich hier garnichts mehr mit Speed multiplizieren brauche und das ganze
schon damit ausgeglichen wird, in dem die While-Schleife in App.cpp solange läuft bis der tlu Wert wieder 0 ist und erst dann erneut gerendert wird?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
while(game_running) { time_delta = last_time - current_time(); last_time = current_time(); if(time_delta > 0.1) time_delta = 1; game.update(time_delta); game.render(); // using v sync to limit framerate! } void Game::update(time_delta) { ... player_position += player_speed * time_delta; ... } |
In deinem Beispiel bedeutet das, dass sich der Spieler optimalerweise immer um 1 fortbewegt (angenommen Speed == 1),
Besser gesagt: Viele Durchläufe - Kleine Schritte (0,01), wenig Durchläufe - große Schritte?
Die 0,1 erhältst du denke ich von 1/10 FPS? Wenn ja hat dies einen bestimmten Grund? Ich habe jetzt während meiner Suche immer was von 1/60 FPS gelesen.
Administrator
komplexer, da man ja bei mordernen Spielen darauf achtet, das alles auf 60 FPS läuft.
Such bei Google mal nach fixed framerate logic variable framerate rendering interpolation extrapolation, dann findest du einige Diskussionen zum Thema.
Was ich gerne mache, weil es einfach und meistens gut genug ist:
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 C-/C++-Quelltext while(game_running) { time_delta = last_time - current_time(); last_time = current_time(); if(time_delta > 0.1) time_delta = 1; game.update(time_delta); game.render(); // using v sync to limit framerate! } void Game::update(time_delta) { ... player_position += player_speed * time_delta; ... }
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void App::run() { while (window.isOpen()) { sf::Clock current_time; // Hier bin ich mir nicht sicher ob current_time richtig gesetzt ist. sf::Time last_time = current_time.getElapsedTime(); sf::Time time_delta = last_time - current_time.getElapsedTime(); // Könnte ich nicht einfach nur time_delta benutzen und immer die getElapsedTime() nutzen? Eigentlich spare ich mir somit // alles andere oder? if (time_delta.asMilliseconds() > 0.1) time_delta = 1; // Hier wird mir derzeit noch ein Fehler angezeigt. Leider ist nur das "=" rot unterstrichen und es stehen keine genaueren Fehlerbeschreibungen // Ich denke das wird irgendwie mit falschen Datentypen etc zusammenhängen? currentState->processEvents(*this, window); currentState->update(*this, window, time_delta); currentState->render(window); } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
while (window.isOpen()) { sf::Clock clock; sf::Time time_delta = clock.getElapsedTime(); // Hier werden mir allerdings noch Fehler angezeigt, bei denen ich nicht genau weiß woher diese kommen. if (time_delta [color=#ff0000][u]>[/u][/color] 0.1) time_delta [color=#ff0000][u]=[/u][/color] 1; window.clear(sf::Color(0, 0, 0)); currentState->processEvents(*this, window); currentState->update(*this, window, time_delta); currentState->render(window); clock.restart(); } |
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Bytron« (09.09.2022, 14:06)
Administrator
Und wie genau nutze ich V Sync?
aber wie läuft sowas dann bei zB Triple A Games ab? Hier dürfe das ja dann auch ein riesen Thema sein und wahrscheinlich wesentlich
komplexer
Werbeanzeige