如何在OpenGL中计算FPS?

rlcwz9us  于 2022-11-04  发布在  其他
关注(0)|答案(4)|浏览(605)
void CalculateFrameRate()
{    
    static float framesPerSecond    = 0.0f;       // This will store our fps
    static float lastTime   = 0.0f;       // This will hold the time from the last frame
    float currentTime = GetTickCount() * 0.001f;    
    ++framesPerSecond;
    if( currentTime - lastTime > 1.0f )
    {
        lastTime = currentTime;
        if(SHOW_FPS == 1) fprintf(stderr, "\nCurrent Frames Per Second: %d\n\n", (int)framesPerSecond);
        framesPerSecond = 0;
    }
}

我应该在void play(void)还是void display(void)中调用此函数?
还是没有任何区别?

64jmpszr

64jmpszr1#

你应该把它放在显示循环中。Here's这篇文章解释了一些你应该阅读的游戏循环的错综复杂之处。

r3i60tvu

r3i60tvu2#

如果你有任何类型的同步例程,我建议你在那之后调用,即在大的计算之前。否则计时计算可能是 * 不稳定的 *,并给予每个循环不同的值...注意,有一个稳定的FPS比波动的FPS更好,只是为了最大化它。波动即使是如此微妙,使观众/玩家意识到这是一个游戏,沉浸感失去了。

pbwdgjma

pbwdgjma3#

void CalculateFrameRate()
{
    static float framesPerSecond = 0.0f;
    static int fps;
    static float lastTime = 0.0f;
    float currentTime = GetTickCount() * 0.001f;
    ++framesPerSecond;
    glPrint("Current Frames Per Second: %d\n\n", fps);
    if (currentTime - lastTime > 1.0f)
    {
        lastTime = currentTime;
        fps = (int)framesPerSecond;
        framesPerSecond = 0;
    }
}
bmp9r5qi

bmp9r5qi4#

在每一帧中调用此函数:

int _fpsCount = 0;
int fps = 0; // this will store the final fps for the last second

time_point<steady_clock> lastTime = steady_clock::now();

void CalculateFrameRate() {
    auto currentTime = steady_clock::now();

    const auto elapsedTime = duration_cast<nanoseconds>(currentTime - lastTime).count();
    ++_fpsCount;

    if (elapsedTime > 1000000000) {
        lastTime = currentTime;
        fps = _fpsCount;
        _fpsCount = 0;

        fmt::print("{} fps\n", fps); // print out fps in every second (or you can use it elsewhere)
    }
}

您可以从fps变量中访问fps值,也可以像当前在代码中一样,每秒只打印一次。

相关问题