Как реализовать игровой цикл в реактив-банане?
Этот вопрос характерен для имитации реактивного банана и моделирования в реальном времени с физическим и визуальным компонентом (например, игры).
В соответствии сИсправьте свой временной шаг! идеальный способ настроить игровой цикл (при условии, что физика должна быть воспроизводимой), вам нужен фиксированный временной интервал между кадрами. Рассмотрев ряд реальных сложностей, автор приходит к этому игровому циклу:
double t = 0.0;
const double dt = 0.01;
double currentTime = hires_time_in_seconds();
double accumulator = 0.0;
State previous;
State current;
while ( !quit )
{
double newTime = time();
double frameTime = newTime - currentTime;
if ( frameTime > 0.25 )
frameTime = 0.25; // note: max frame time to avoid spiral of death
currentTime = newTime;
accumulator += frameTime;
while ( accumulator >= dt )
{
previousState = currentState;
integrate( currentState, t, dt );
t += dt;
accumulator -= dt;
}
const double alpha = accumulator / dt;
State state = currentState*alpha + previousState * ( 1.0 - alpha );
render( state );
}
Сводка заключается в том, что физическое моделирование всегда подается с одинаковым приращением времени (dt
) для численной устойчивости. Для этого необходимо учитывать, что физика и визуальные эффекты могут обновляться на разных частотах, и вы не хотите слишком сильно отставать.
Например, вам могут потребоваться обновления с частотой 20 Гц, но визуальное обновление с частотой кадров 60 Гц. Этот цикл выполняет линейную интерполяцию физики, чтобы компенсировать физические обновления и графические обновления.
Кроме того, когда разница во времени между кадрами намного больше, чемdt
есть цикл для обработки пошаговых обновлений кускамиdt
, Примечание о спирали смерти относится только к случаю, когда ваши физические расчеты просто не успевают за желаемой частотой обновлений, поэтому вы можете пропустить некоторые обновления.
В этом обсуждении часть, которую я больше всего интересую, - это организация вызова физического движка (вызовintegrate
) всегда наступаетdt
, Есть лиreactive-banana позволить пользователю написать этот цикл стиля? Если так, то как? Возможно, пример, выполняющий физическое моделирование в реальном времени, в порядке (или уже существует)?