3

次のコードは節電を行いますが、FPS は適切に制限されません。フレームレートを 60 FPS でロックすることになっている場合、82 が得られます。30 の場合も同様で、49 FPS が得られます。

FPS の計算:

previousTime = currentTime;
currentTime = SDL_GetTicks();
fps_++;

if (currentTime - lastOutput >= 1000)
{
    lastOutput = currentTime;
    fps = fps_; // the variable 'fps' is displayed 
    fps_ = 0;
}

FPS の制限:

if (currentTime - previousTime < 1000 / maxFPS)
{
    SDL_Delay(1000 / maxFPS - currentTime + previousTime);
}

私は何を台無しにしましたか?

4

3 に答える 3

1

次のような Renderer を作成すると、次のようになります。

SDL_Renderer *renderPtr = SDL_CreateRenderer(windowPtr, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

SDL_RENDERER_PRESENTVSYNC FLAG は、Present 関数をモニターのリフレッシュ レートに一致させます。

これが役立つことを願っています!! 私は多くの頭痛の種になりました!!!

ここに参照があります: https://wiki.libsdl.org/SDL_CreateRenderer

于 2015-03-25T14:39:59.687 に答える
1

私は専門家ではありませんが、これを試すことができます!

SDL_Delay(1000 / maxFPS - SDL_GetTicks() + previousTime);

新しく計算された現在の時刻を使用すると役立つ場合があります

于 2012-07-08T01:15:17.617 に答える
0

これは、SDL_Delay がオペレーティング システムに、実行中のプロセスを切り替えるように指示することが原因である可能性があります。使用している OS によっては、何らかの意味で異なる動作になる可能性があります。通常、SDL_Delay は、指定されたミリ秒数の後に実行が正確に続行されることを保証するものではありません。プロセスを元に戻すには、少なくともそれだけ待つことが保証されていると言う人もいますが、その証拠を見つけることができませんでした. どちらかというとOSへの推奨のようなものだと思いますが、最終的にはOSが勝手に決めることになります(OSによる)。

ただし、Windows の場合、コンテキスト切り替えの粒度を変更できるため、これを制御できる可能性が高くなります: timeBeginPeriod 関数

あなたはおそらくこれについてもう疑問に思っていませんが、おそらく答えは他の誰かを助けることができます..

于 2014-05-05T03:41:53.347 に答える