この質問は、物理的および視覚的コンポーネント (ゲームなど) を使用したリアクティブ バナナおよびリアルタイム シミュレーションに固有のものです。
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
概要は、数値安定性のために、物理シミュレーションには常に同じ時間増分 ( ) が供給されるということです。そのための調整では、物理とビジュアルが異なる頻度で更新される可能性があることを考慮する必要があり、遅れすぎないようにする必要があります。
たとえば、20hz の頻度で更新したいが、60hz のフレームレートで視覚的な更新が必要な場合があります。このループは物理の線形補間を行い、物理の更新とグラフィックの更新の違いを補います。
dt
さらに、フレーム間の時間の差が のチャンクでの更新のステップ実行を処理するためのループよりもはるかに大きい場合dt
。死のスパイラルに関するメモは、物理計算が更新の望ましい頻度に追いつかない場合に言及しているだけなので、いくつかの更新をスキップできるようにします。
この議論で私が最も興味を持っている部分は、物理エンジンへの呼び出し ( への呼び出しintegrate
) が常に によってステップ実行されるように調整することdt
です。反応バナナは、ユーザーがこのスタイルのループを書くことを許可しますか? もしそうなら、どのように?おそらく、リアルタイムの物理シミュレーションを実行する例が用意されている (または既に存在する) のでしょうか?