Я хочу реализовать дельта-синхронизацию в моем цикле SFML, чтобы компенсировать другие компьютеры, которые решили запустить мое приложение, сейчас у меня просто есть
float delta = .06
помещен перед моим циклом, но, как в википедии описывается время дельты:
Это делается путем вызова таймера каждый кадр в секунду, который содержит
время между текущим и последним вызовом в миллисекундах. [2] После этого
Полученное число (Delta Time) используется для расчета, насколько быстрее
что, например, игровой персонаж должен двигаться, чтобы восполнить
спайк лага, вызванный в первую очередь. [3]
Вот что я делаю, это НЕПРАВИЛЬНО в настоящее время я не могу перевести логику в синтаксис:
bool running=true; //set up bool to run SFML loop
double lastTime = clock.getElapsedTime().asSeconds();
sf::Clock clock; //clock for delta and controls
while( running )
{
clock.restart();
double time= clock.getElapsedTime().asSeconds();
double delta = time - lastTime; //not working... values are near 0.0001
time = lastTime;
//rest of loop
Не должно ли это быть:
sf::Clock clock;
while( running )
{
double delta = clock.restart().asSeconds(); // asMilliseconds()
//rest of loop
}
(Я полагаю, вам не нужно время и last_time)
Ваш цикл работает так быстро, что ваша дельта в секундах очень мала. Почему бы не измерить это в миллисекундах?
переключатель .asSeconds()
в .asMilliseconds()
, Посмотрите Вот для документации.
Ваш подход почти правильный. Однако, если вы рассчитываете разницу во времени самостоятельно (вычитая предыдущее время), вы не должны сбрасывать sf::Clock
,
Для переменных временных шагов вы можете использовать решение Дитера. Тем не менее, я бы предложил одну крошечную модификацию:
sf::Clock clock
while (running) {
// do event processing here
const sf::Time delta = clock.restart();
// do your updates here
sf::sleep(sf::microseconds(1));
}
То, что я сделал по-другому, это две вещи:
delta
время как sf::Time
объект. Это не очень существенное изменение. Тем не менее, это позволяет мне позже извлечь разницу в различных единицах (просто получение секунд или миллисекунд — это нормально).delta
0. Хотя это довольно маловероятно, если вы используете необработанные микросекунды отслеживания времени, это может быть проблемой, если вы оцениваете только миллисекунды (в этом случае вы можете даже хотеть спать целые миллисекунды). В зависимости от настроек грануляции / энергосбережения (таймера) системы это может быть немного медленнее по сравнению с тем, что он вообще не спит, но это не должно быть заметно (поскольку SFML также пытается бороться с этой проблемой).То, что вы хотите, в основном это:
while(running)
{
sf::Time now = clock.getElapsedTime();
deltaTime = now - lastTime;
lastTime = now;
}
Для sf::sleep
упоминается Марио, вы должны просто использовать sf::RenderWindow::setFramerateLimit(unsigned int)
ограничить число кадров в секунду, как вы хотите, и SFML позаботится о том, чтобы ваше приложение спало в течение правильного количества времени в каждом цикле.