Como implementar um loop de jogo em banana reativa?

Esta questão é específica para simulações reativas de banana e em tempo real com um componente físico e visual (por exemplo, jogos).

De acordo comConserte seu Timestep! a maneira ideal de configurar um loop de jogo (assumindo a física que precisa ser reproduzível), você precisa de um intervalo de tempo fixo entre os quadros. Depois de considerar uma série de complicações reais, o autor chega a este loop de jogo:

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 );
}

A sinopse é que a simulação física é sempre alimentada com o mesmo incremento de tempo (dt) para estabilidade numérica. Para isso, é preciso considerar que a física e o visual podem ser atualizados em frequências diferentes e você não quer ficar muito atrás.

Por exemplo, você pode querer atualizações com uma frequência de 20hz, mas uma atualização visual com uma taxa de quadros de 60hz. Esse loop faz interpolação linear da física para compensar a diferença entre atualizações físicas e atualizações gráficas.

Além disso, quando a diferença de tempo entre os quadros é muito maior do quedt há um loop para lidar com as atualizações em pedaços dedt. A nota sobre a espiral da morte apenas se refere a um caso em que seu cálculo de física simplesmente não consegue acompanhar a frequência desejada de atualizações, então você permite que ele pule algumas atualizações.

Para esta discussão, a parte em que estou mais interessado é organizar para que a chamada ao mecanismo de física (a chamada paraintegrate) é sempre intensificadadt. Fazreativa-banana permitir que o usuário escreva esse loop de estilo? Se sim como? Talvez um exemplo de simulação física em tempo real esteja em ordem (ou já exista)?

questionAnswers(1)

yourAnswerToTheQuestion