如何制作基本的 FPS 计数器?

新手上路,请多包涵

我试图在我的立方体渲染程序中显示我的每秒帧数。我想看看它的表现。那么,我该怎么做呢?我已经对此进行了研究,但是我看到的示例使用了多个类并且仍然不起作用,或者它们使用了我没有的库。有没有办法通过使用像 ctime 这样的预安装库来获得 FPS?我正在使用带有 C++ 的 OpenGL。

这是我的(空)函数:

 void GetFPS()
{

}

然后我在我的渲染函数中显示我的 FPS:

 std::cout << xRot << " " << yRot << " " << zRot << " " << FPS << "\n"; //xRot, yRot, and zRot are my cube's rotation.

我的程序设置为 60FPS,但我想查看实际的 FPS,而不是设置的内容。

原文由 Xenonic 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

您必须使用 clock() 对 2 个不同的时间间隔进行采样,但是请注意存在几个问题:

  • 时钟的分辨率是几毫秒(您可以使用 std::chrono 等解决方法,但是根据实现,即使 chrono 也可能没有那么高的分辨率。在我的带有 GCC 4.9.1 的 PC 上,即使使用 std,我也从来没有得到比 16 毫秒更好的分辨率: : 计时。
  • 通常使用 clock() 你会得到 0 很多次,有时你会测量一个实时(在我的情况下它只是跳跃 1516 毫秒)
  • 除非您使用垂直同步(vsync),否则您不会测量实际帧时间,而只会测量渲染循环中花费的 CPU 时间(要激活 vsync,您必须使用您的 OS 功能的 SetSwapInterval(1) 或例如使用像 SDL 这样的库提供可移植的跨平台实现)
  • 要测量实际渲染时间,您可以使用 GL 的时间查询(您可能随时只有 1 个计时器绑定,因此如果您正在测量帧速率,则无法测量渲染特定内容需要多长时间)。
  • 不要测量 FPS(除非您只想向用户展示它),而是以毫秒为单位测量帧时间,这样可以更直观地近似性能。 (你知道从 100 到 80 FPS 相差 2.5 毫秒,从 40 到 20 FPS 相差 25 毫秒!)

去做:

 double clockToMilliseconds(clock_t ticks){
    // units/(units/time) => time (seconds) * 1000 = milliseconds
    return (ticks/(double)CLOCKS_PER_SEC)*1000.0;
}
//...

clock_t deltaTime = 0;
unsigned int frames = 0;
double  frameRate = 30;
double  averageFrameTimeMilliseconds = 33.333;

while(rendering){

    clock_t beginFrame = clock();
    render();
    clock_t endFrame = clock();

    deltaTime += endFrame - beginFrame;
    frames ++;

    //if you really want FPS
    if( clockToMilliseconds(deltaTime)>1000.0){ //every second
        frameRate = (double)frames*0.5 +  frameRate*0.5; //more stable
        frames = 0;
        deltaTime -= CLOCKS_PER_SEC;
        averageFrameTimeMilliseconds  = 1000.0/(frameRate==0?0.001:frameRate);

        if(vsync)
            std::cout<<"FrameTime was:"<<averageFrameTimeMilliseconds<<std::endl;
        else
           std::cout<<"CPU time was:"<<averageFrameTimeMilliseconds<<std::endl;
    }
}

当你做一些需要几秒钟的事情时,上面的代码也可以工作。我做了一个每秒更新的计算,你也可以更频繁地更新它。 (请注意,我在大多数需要 FPS 的项目中都使用该代码)

原文由 CoffeDeveloper 发布,翻译遵循 CC BY-SA 3.0 许可协议

快速而完整

#include <time.h>   // clock
#include <stdio.h>  // snprintf

unsigned int iMemClock, iCurClock, iLoops;
char aFPS[12];

/* main loop */
{
    if (iMemClock > (iCurClock = clock()))
        iLoops++;
    else
    {
        snprintf(aFPS, sizeof(aFPS),"FPS: %d",iLoops);
        iMemClock = iCurClock + CLOCKS_PER_SEC;
        iLoops = 0;
    }

    /*
    someRoutines();
    */
}
/* main loop */

原文由 Александр Балуев 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏