2012-04-14 9 views
1

私たちはC++クラス用のゲームエンジンを作っています.FPSのマイナーな問題を除いてほとんどすべてが完了しています。それは常に私たちが設定したものよりも約10〜20%遅く実行されます。これがバグ/厄介なコードによるものなのか、まさにその通りなのか疑問に思っています。 500を超えると350に設定されていますが、これはコンピュータが処理できないことが主な原因です。 50に設定すると、約40-44になります。SDL - C++でのLoopTimerのFPS問題

class LoopTimer { 
public: 
    LoopTimer(const int fps = 50); 
    ~LoopTimer(); 

    void Update(); 
    void SleepUntilNextFrame(); 

    float GetFPS() const; 
    float GetDeltaFrameTime() const { return _deltaFrameTime; } 

    void SetWantedFPS(const int wantedFPS); 
    void SetAccumulatorInterval(const int accumulatorInterval); 

private: 
    int _wantedFPS; 
    int _oldFrameTime; 
    int _newFrameTime; 
    int _deltaFrameTime; 
    int _frames; 
    int _accumulator; 
    int _accumulatorInterval; 
    float _averageFPS; 
}; 

CPP更新は基本的にrunメソッドで私たちのGameManagerに呼び出されている

LoopTimer::LoopTimer(const int fps) 
{ 
    _wantedFPS = fps; 
    _oldFrameTime = 0; 
    _newFrameTime = 0; 
    _deltaFrameTime = 0; 
    _frames = 0; 
    _accumulator = 0; 
    _accumulatorInterval = 1000; 
    _averageFPS = 0.0; 
} 
void LoopTimer::Update() 
{ 
    _oldFrameTime = _newFrameTime; 
    _newFrameTime = SDL_GetTicks(); 
    _deltaFrameTime = _newFrameTime - _oldFrameTime; 

    _frames++; 
    _accumulator += _deltaFrameTime; 

    if(_accumulatorInterval < _accumulator) 
    { 
     _averageFPS = static_cast<float>(_frames/(_accumulator/1000.f)); 
     //cout << "FPS: " << fixed << setprecision(1) << _averageFPS << endl; 
     _frames = 0; 
     _accumulator = 0; 
    } 
} 


void LoopTimer::SleepUntilNextFrame() 
{ 
    int timeThisFrame = SDL_GetTicks() - _newFrameTime; 
    if(timeThisFrame < (1000/_wantedFPS)) 
    { 
     // Sleep the remaining frame time. 
     SDL_Delay((1000/_wantedFPS) - timeThisFrame); 
    } 
} 

ファイル:ここで

は、タイマーを扱うLoopTimerクラスからいくつか抜粋

ヘッダーがあります:

int GameManager::Run() 
{ 
while(QUIT != _gameStatus) 
    { 
     SDL_Event ev; 

     while(SDL_PollEvent(&ev)) 
    { 
      _HandleEvent(&ev); 
    } 

    _Update(); 
    _Draw(); 

    _timer.SleepUntilNextFrame(); 
    }  
    return 0; 
} 

必要に応じていくつかのコードを追加することもできますし、コードを必要とする人にはこのコードを提供しても構いません。それはsdl_net関数やその他のものを含めてかなり進んでいますので、ここにすべてをダンプすることは何もありません。

とにかく、私は別のlooptimer機能、それを改善する方法のいずれか、誰かがフレームレートに関する巧妙な先端を有する願っていますか、私だけを伝えることで、それがFPSに小さな損失を持つことが普通です:)

答えて

0

私はそこだと思います実際に希望FPSよりも高いFPSを送ったあなたのfonction

int timeThisFrame = /* do you mean */ _deltaFrameTime; //SDL_GetTicks() - _newFrameTime; 
+0

でエラー:200にPは、それが平均fpsの背後にある数学のバグかもしれないが、私は詳しく見て必要があります270に行ってきました。おかげで:) –