私たちは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に小さな損失を持つことが普通です:)
でエラー:200にPは、それが平均fpsの背後にある数学のバグかもしれないが、私は詳しく見て必要があります270に行ってきました。おかげで:) –