2012-05-07 6 views
2

ゲームが一定のレートで更新されるように固定タイムステップループを実装しようとしています。私はhttp://gafferongames.com/game-physics/fix-your-timestep/で偉大な記事を見つけましたが、それを自分自身の2dエンジンに翻訳するのに問題があります。C++の固定タイムステップループ

私が言及している特定の場所は、最後の部分の機能です。「最後のタッチ」は、ほとんどの人が推奨するものです。これは彼の関数である:

自分で
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); 
    } 

、私はちょうど、xとyの位置だけでなく、速度を追跡するのではなく、結石の統合を行っている画面上でプレイヤーを移動しています。 **私はプレイヤーの位置の更新(dtまたはt?)に何を適用するのか混乱しています。誰かがこれを打破し、それをさらに説明できますか?

2番目の部分は、提供されている式が意味をなさないことを理解し、現在のxとyのプレイヤーの位置を単純に補間することができる補間です。

さらに、私はより正確なタイマーを取得する必要があることを認識しています。

+1

この関数は、(http://en.wikipedia.org/wiki/Integral)[微積分からの積分]です。あなたはタイマーイベントについて質問しているようです。これらはお互いに関係がありません。 – chrisaycock

+0

@chrisaycock混乱して申し訳ありません。質問が更新されました。 –

+0

あなたは統合を行っているが、統合を行っていないと言っているので、確かに混乱している。はい、基本的な計算からの統合です。 –

答えて

0

参照: http://en.wikipedia.org/wiki/Integral & http://en.wikipedia.org/wiki/Numerical_integration

関数が積分関数(第1リンク)を近似するための数値手法(第2リンク)です。

+0

これはコメントである必要があります。 – chrisaycock

+0

申し訳ありませんが、私は質問を更新しました。私はそれをひどく言いました。私は主な機能が時間とデルタ時間をどのように使っているのか、それをどのようにxとyの位置の2dプレーヤーの移動に適用するのだろうと思っていました。 –

+0

@chrisaycock私は同意しません。最初に述べたように質問に答えました。また、私はコメント - 唯一の回答を投稿することはできません。 –

-1

あなたの高校物理を見直す必要があります。 (dvdt)dxdtを知っていれば、dvdtを知っていればdxdtをt/tとの積分で距離を求めることができます。 tに関してそれを積分することによって速度を得ることができる。明らかにこれは非常に簡単な説明ですが、もしあなたが望むなら、そこにはたくさんの参考文献があります。あなたは、少なくともマイクロ秒の精度を得ることができる場合

+0

申し訳ありませんが、私は質問を更新しました。私はそれをひどく言いました。私は主な機能が時間とデルタ時間をどのように使っているのか、それをどのようにxとyの位置の2dプレーヤーの移動に適用するのだろうと思っていました。 –

+0

私はまだ高校の物理学を再訪することをお勧めします。あなたは適切な数学的背景を持っていれば十分です。私はコードを持っていないので、正確には "統合する"ことは言えませんが、私の推測は更新currentStateで、時間dtのチャンクのオブジェクトの加速度と速度に基づいて新しい位置を再計算します。時間に関してあなたの速度を積分することによって、あなたはあなたの加速度を時間に関して積分することによってあなたの速度を計算します。これはおそらく彼がこのスニペットでやっていることです) – user439407

1

、これを試してみてください。

long int start = 0, end = 0; 
double delta = 0; 
double ns = 1000000.0/60.0; // Syncs updates at 60 per second (59 - 61) 
while (!quit) { 
    start = timeAsMicro(); 
    delta+=(double)(start - end)/ns; 
    end = start; 

    while (delta >= 1.0) { 
     doUpdates(); 
     delta-=1.0; 
    } 
}