2012-03-22 4 views
0

私は、次のTimerクラスがあります。タイマークラスの速度係数を設定していますか?

class Timer 
{ 
    private: 
    unsigned int curr,prev; 
    float factor; 
    float delta; 

    public: 
    Timer(float FrameLockFactor) 
    { 
     factor = FrameLockFactor; 
    } 

    ~Timer() 
    { 

    } 

    void Update() 
    { 
     curr = SDL_GetTicks(); 
     delta = (curr - prev) * (1000.f/factor); 
     prev = curr; 
    } 

    float GetDelta() 
    { 
     return delta; 
    } 
}; 

を、私はこのようにそれを使用します。

//Create a timer and lock at 60fps 
Timer timer(60.0f); 

while() 
{ 
    float delta; 
    float velocity = 4.0f; 

    timer.Update(); 

    delta = timer.GetDelta(); 

    sprite.SetPosition(sprite.GetVector() + Vector2(0.0,velocity * delta)); 
    sprite.Draw(); 
} 

しかし、大きな問題がある:私のゲームをすることになっているプログラムのためにあまりにも遅い実行します毎秒60フレームで実行され、同じテストコードが、フレームに依存しない動きを使用しないときに滑らかに動作するので、コードに問題があるはずです。

助けが必要ですか?

答えて

1

deltaがフレームの数であることが想定される場合、それは次の式を使用してフレームindepented運動を達成するために、デルタ値を持つすべての速度を乗算イム

delta = (curr - prev) * (factor/1000.f); 
+0

ありがとうございます。いくつかの研究の後、私は、フレームに依存しない代わりに、ゲームで固定フレームレートを持つことが本当に良いということを発見しました。 – user1010005

0

私は実際にあなたのコードで何をしようとしているのか分かりません。特に私が見る限り、delta = (curr - prev) * (1000.f/factor);という行は意味をなさない。

これを正しく理解していれば、最後の更新からどれくらいの時間が経過したかを計算し、フレームごとにミリ秒に変換しようとしています。どのようなユニットを使用していますか?

私はSDL_GetTicks();によって返されるものはわかりません。これは返されるプロセッサまたはリアルクロックのティックの数ですか?実際のクロックティックを返す場合、(curr-prev)の部分は、ほとんどの場合ゼロになります。これは、フレームごとに複数の更新を行う必要があるためです。

実際のクロックティックが戻ってこない場合は、なぜ1000fを掛けていますか?この要素はどこから来たのですか?

このようなコードでは、丸め誤差を処理す​​ることが非常に重要なことが多いため、この領域のどこかに問題があると推測しています。追加情報なしで私はあなたのアクチュアールの問題が何であるかは分かりません。

+0

のように計算されるべきではない:(currTicks -PrevTicks)/ 1000.0f。しかし、今私は60fpsのような可変係数でフレームを制限できるようにしたい。 – user1010005

関連する問題