我试图在我的多维数据集渲染程序中显示每秒的帧数。我想看看它的表现。那么,我该怎么办呢?我已经对此进行了研究,但是我看到的示例使用了多个类,但仍然无法使用,或者它们使用的是我没有的库。有没有办法通过使用预安装的库(例如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,而不是它的设置。

最佳答案

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

时钟的

  • 分辨率为几毫秒(您可以使用std::chrono等来解决,但是根据实现的不同,即使chrono也可能没有那么高的分辨率。在装有GCC 4.9.1的PC上,即使使用std,我也无法获得比16毫秒更好的分辨率:: chrono.
  • 通常使用clock()您将获得0多次,并且有时您将测量一个实时时间(在我的情况下,它只是跳了15/16毫秒)
  • ,除非您使用垂直同步(vsync),否则您将不会测量实际帧时间,而只会测量渲染循环中花费的CPU时间(要激活vsync,您必须使用OS函数或例如使用SDL之类的库来设置SetSwapInterval(1)提供便携式跨平台实现)
  • 要测量真实的渲染时间,您可以使用GL的时间查询(您随时都可以绑定(bind)1个计时器,因此,如果要测量帧速率,则无法测量特定对象渲染所需的时间)。
  • 不要测量FPS(除非您只想向用户展示,否则不要测量),而是以毫秒为单位测量帧时间,这样可以更直观地估算性能。 (您知道从100 FPS到80 FPS的间隔是2.5毫秒,从40 FPS到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的项目中都使用了该代码)

    10-08 08:23
    查看更多