我试图在我的立方体渲染程序中显示每秒帧数。我想看看它的表现。那么,我该怎么做呢?我已经对此进行过研究,但是我见过的例子既可以使用多个课程,也可以不工作,或者他们使用我不具备的图书馆。有没有办法通过使用像ctime这样的预安装库来获取FPS?我正在使用OpenGL和C ++。
这是我的(空)功能:
void GetFPS()
{
}
然后我在我的渲染功能中显示我的FPS:
std::cout << xRot << " " << yRot << " " << zRot << " " << FPS << "\n"; //xRot, yRot, and zRot are my cube's rotation.
我的程序设置为60FPS,但我希望看到实际的FPS,而不是它设置的内容。
答案 0 :(得分:10)
您必须使用clock()
对2个不同的时间间隔进行采样
但是请注意有几个问题:
clock()
你将获得0次,并且在某个时候你会测量一个实时(在我的情况下它只是跳15/16毫秒)那样做:
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的项目中都使用了该代码)
答案 1 :(得分:6)
只需在渲染场景之前和之后保存时间“滴答”,然后进行简单的计算。
以下是使用<ctime>
的{{1}}函数的示例。 (请注意,clock()
在不同平台上的工作方式不同)
clock()
答案 2 :(得分:1)
只需在任意循环中调用此函数即可测量每秒的调用次数。
#include <chrono>
void printFPS() {
static std::chrono::time_point<std::chrono::steady_clock> oldTime = std::chrono::high_resolution_clock::now();
static int fps; fps++;
if (std::chrono::duration_cast<std::chrono::seconds>(std::chrono::high_resolution_clock::now() - oldTime) >= std::chrono::seconds{ 1 }) {
oldTime = std::chrono::high_resolution_clock::now();
std::cout << "FPS: " << fps << std::endl;
fps = 0;
}
}
答案 3 :(得分:0)
如果仅出于打印目的而测量FPS,则可以使用std::chrono
来测量壁钟。使用std::clock()
可以得到比std::chrono
更准确的值,因为它可以测量处理时间,但也许您不想以如此高的精度打印FPS。
下面的解决方案使用std::chrono
计算程序的正常运行时间,并在每次更新帧后增加帧计数器。将帧计数器除以程序的正常运行时间即可获得FPS。
#include <chrono>
#include <iostream>
#include <thread>
using namespace std::chrono;
steady_clock::time_point first_tp;
unsigned long frame_count = 0;
duration<double> uptime()
{
if (first_tp == steady_clock::time_point{})
return duration<double>{ 0 };
return steady_clock::now() - first_tp;
}
double fps()
{
const double uptime_sec = uptime().count();
if (uptime_sec == 0)
return 0;
return frame_count / uptime_sec;
}
void time_consuming_function()
{
std::this_thread::sleep_for(milliseconds{ 100 });
}
void run_forever()
{
std::cout << "fps at first: " << fps() << '\n';
first_tp = std::chrono::steady_clock::now();
while (true)
{
std::cout << "fps: " << fps() << '\n';
time_consuming_function();
frame_count++;
}
}
int main()
{
run_forever();
}
在我的计算机上运行它会产生:
$ ./measure_fps
fps at first: 0
fps: 0
fps: 9.99108
fps: 9.99025
fps: 9.98997
fps: 9.98984
将其修改为std::clock()
会得到
$ ./measure_fps
fps at first: 0
fps: 0
fps: 37037
fps: 25316.5
fps: 23622
fps: 22346.4