Этот вопрос относится к реактивно-банановым симуляциям и симуляциям в реальном времени с физическим и визуальным компонентом (например, играм).
Согласно Fix Your Timestep! идеальный способ настроить игровой цикл (при условии физика, которая должна быть воспроизводимой), вам нужен фиксированный временной шаг между кадрами. После рассмотрения ряда реальных сложностей автор приходит к такому игровому циклу:
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 пользователю написать этот цикл стилей? Если да, то как? Возможно, пример моделирования физики в реальном времени подходит (или уже существует)?